• 组合模式(Composite)


    组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

    public abstract class Company
        {
            protected string name;
            public Company(string name)
            {
                this.name = name;
            }
            public abstract void Add(Company company);
            public abstract void Remove(Company company);
            public abstract void Display(int depth);
            public abstract void LineOfDuty();
        }
    public class ConcreteCompany:Company
        {
            private IList<Company> companys = new List<Company>();
            public ConcreteCompany(string name)
                :base(name)
            {
    
            }
            public override void Add(Company company)
            {
                companys.Add(company);
            }
    
            public override void Remove(Company company)
            {
                companys.Remove(company);
            }
    
            public override void Display(int depth)
            {
                Console.WriteLine(new string('-',depth) + name);
                foreach(var company in companys)
                {
                    company.Display(depth + 2);
                }
            }
    
            public override void LineOfDuty()
            {
                foreach(var company in companys)
                {
                    company.LineOfDuty();
                }
            }
        }
    public class HRDepartment:Company
        {
            public HRDepartment(string name)
                :base(name)
            {
    
            }
            public override void Add(Company company)
            {
                
            }
    
            public override void Remove(Company company)
            {
                
            }
    
            public override void Display(int depth)
            {
                Console.WriteLine(new string('-', depth) + name);
            }
    
            public override void LineOfDuty()
            {
                Console.WriteLine("{0} 员工招聘培训管理",name);
            }
        }
    public class FinanceDepartment:Company
        {
            public FinanceDepartment(string name)
                : base(name)
            {
    
            }
            public override void Add(Company company)
            {
                
            }
    
            public override void Remove(Company company)
            {
                
            }
    
            public override void Display(int depth)
            {
                Console.WriteLine(new string('-', depth) + name);
            }
    
            public override void LineOfDuty()
            {
                Console.WriteLine("{0} 公司财务收支管理",name);
            }
        }
    class Program
        {
            static void Main(string[] args)
            {
                Company rootCompany = new ConcreteCompany("北京总公司");
                rootCompany.Add(new HRDepartment("总公司人力资源部"));
                rootCompany.Add(new FinanceDepartment("总公司财务部"));
    
                Company eastCompany = new ConcreteCompany("华东分公司");
                eastCompany.Add(new HRDepartment("华东分公司人力资源部"));
                eastCompany.Add(new FinanceDepartment("华东分公司财务部"));
    
                rootCompany.Add(eastCompany);
    
                Company shanghaiCompany = new ConcreteCompany("上海办事处");
                shanghaiCompany.Add(new HRDepartment("上海办事处人力资源部"));
                shanghaiCompany.Add(new FinanceDepartment("上海办事处财务部"));
    
                eastCompany.Add(shanghaiCompany);
    
                Console.WriteLine("机构图:");
                rootCompany.Display(1);
    
                Console.WriteLine("职责:");
                rootCompany.LineOfDuty();
            }
        }

    关于Leaf中也有add和remove。

    这种方式叫做透明方式,也就是说在Component中声明所有用来管理子对象的方法,其中包括add,remove等。这样实现Component接口的所有子类都具备了add和remove。这样的好处是叶节点和枝节点

    对于外界没有区别,完全一致的接口。问题是,leaf本身并不具备add和remove方法的功能,所以实现它是没有意义的。

    安全方式,也就是在Componet接口中不去声明add和remove方法。那么子类的leaf也就不需要去实现它,而在Composite声明所有用来管理子类对象的方法。但是不够透明。树叶和树枝将不具有相同的 接口

    ,客户端的调用要做相应的判断,带来了不便。

    什么地方用:

    当需求中是体现部分与整体层次的结构时,以及希望用户忽略组合对象和单个对象的不同,统一的使用组合结构中的所有对象时,就考虑使用组合模式。

  • 相关阅读:
    DotNet 获取所有 SQL Server 的数据库实例名称
    SQL Server 2008 R2 导出数据脚本的方法
    使用 Jquery 获取 Internet Explorer 浏览器版本
    OpenCV(EmguCV)2.1新特性介绍之图像差异StereoSGBM与设置窗口属性SetWindowProperty(StereoSGBM Of OpenCV 2.1)
    OpenCV(EmguCV)2.1新特性介绍之图像分割GrabCut(GrabCut Of OpenCV 2.1)
    背景建模与前景检测之三(Background Generation And Foreground Detection Phase 3)
    使用Lingobit Localizer汉化.net程序(Translate .net program using Lingobit Localizer)
    返修&售后服务管理网站设计与源码
    解决Windows7无法安装SP1补丁包及无法显示Windows功能列表的方法
    javascript获取到textarea文本框中的回车换行符
  • 原文地址:https://www.cnblogs.com/suzixuan/p/7040867.html
Copyright © 2020-2023  润新知