设计模式(十一)——树形结构:组合模式

组合模式

组合模式(Composite Pattern),又称之为部分整体模式。将对象组合成树形结果以表示“部分-整体”的层次结果。组合模式使得用户对单个对象的组合对象具有一致性。当需求中国是提现部分与整体层次的结构是,以及希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑组合模式了。
如下所示,一般公司的结构体系就是典型的组合模式范例:
公司职能体系
其类结构设计如下:

组合模式公司结构图

    public abstract class Company
    {
        protected string name;

        protected List<Company> children;

        public Company(string name)
        {
            this.name = name;
            children = new List<Company>();
        }

        public virtual void Add(Company company)
        {
            children.Add(company);
        }

        public virtual void Remove(Company company)
        {
            children.Remove(company);
        }

        public virtual void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + name);
            foreach (var com in children)
            {
                com.Display(depth + 2);
            }
        }

        /// <remarks>职能</remarks>
        public abstract void LineOfDuty();
    }
    /// <remarks>具体公司</remarks>
    public class ConcreteCompany : Company
    {
        public ConcreteCompany(string name) : base(name)
        {

        }

        public override void LineOfDuty()
        {
            Console.WriteLine("\n{0} 管理下属部门和公司", this.name);
            foreach (var com in children)
            {
                com.LineOfDuty();
            }
        }
    }
        /// <remarks>人力资源部</remarks>
    public class HRDepartment : Company
    {
        public HRDepartment(string name) : base(name)
        {

        }

        public override void LineOfDuty()
        {
            Console.WriteLine("{0} 员工招聘培训管理", this.name);
        }
    }
        /// <remarks>财务部</remarks>
    public class FinanceDepartment : Company
    {
        public FinanceDepartment(string name) : base(name)
        {

        }

        public override void LineOfDuty()
        {
            Console.WriteLine("{0} 公司财务收支管理", this.name);
        }
    }
    
 class Program
    {
        static void Main(string[] args)
        {
            ConcreteCompany root = new ConcreteCompany("总部");
            root.Add(new HRDepartment("总部人力资源部"));
            root.Add(new FinanceDepartment("总部财务部"));

            ConcreteCompany company = new ConcreteCompany("西南分公司");
            company.Add(new HRDepartment("西南分公司人力资源部"));
            company.Add(new FinanceDepartment("西南分公司财务部"));

            ConcreteCompany company1 = new ConcreteCompany("成都分公司");
            ConcreteCompany company2 = new ConcreteCompany("重庆分公司");
            company.Add(company1);
            company.Add(company2);
            root.Add(company);

            company1.Add(new HRDepartment("成都人力资源部"));
            company1.Add(new HRDepartment("成都财务部"));
            company2.Add(new HRDepartment("重庆人力资源部"));
            company2.Add(new HRDepartment("重庆财务部"));
            Console.WriteLine("公司结构图:");
            root.Display(1);
            Console.WriteLine("职责划分:");
            root.LineOfDuty();

        }
执行结果如下所示:
公司结构图:
-总部
---总部人力资源部
---总部财务部
---西南分公司
-----西南分公司人力资源部
-----西南分公司财务部
-----成都分公司
-------成都人力资源部
-------成都财务部
-----重庆分公司
-------重庆人力资源部
-------重庆财务部
职责划分:

总部 管理下属部门和公司
总部人力资源部 员工招聘培训管理
总部财务部 公司财务收支管理

西南分公司 管理下属部门和公司
西南分公司人力资源部 员工招聘培训管理
西南分公司财务部 公司财务收支管理

成都分公司 管理下属部门和公司
成都人力资源部 员工招聘培训管理
成都财务部 员工招聘培训管理

重庆分公司 管理下属部门和公司
重庆人力资源部 员工招聘培训管理
重庆财务部 员工招聘培训管理

由上述例子可以看出,采用组合模式可以很容易的构建一套树形结构,对于类似这种分上下层次关系的可以考虑采用组合模式的方式来实现。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值