组合模式——统一的公司结构

简介: 组合模式——统一的公司结构

  组合模式(Composite)模式定义:将对象组合成树形结构以表示"部分—整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

  使用场景

  • 体现部分与整体层次的结构时
  • 忽略组合对象与单个越想的不同,统一的使用组合结构中的所有对象 (整体和部分可以被一致对待)

  分类

  • 透明方式:子继承父,并具备父类所有方法,这样子类与子类之间对于外界没有区别,具备完全一致的行为接口(允许重写的方法无意义)。
  • 安全方式 :子类1继承父,不去声明无意义的方法;子类2继承父,能声明所有父类方法且有意义,这里子类1和子类2具有不同的接口,客户端调用时需要做相应的判断。


  • 代码背景:总公司和分公司共用一套管理系统,无论是总公司还是分公司都有人力和财务部门,一个系统全公司使用,要求分清结构且功能一致。

抽象公司类:有添加删除下属分公司,以及显示和履行职责的功能。

    abstract  class Company
    {
        protected string name;
        public Company (string name)
        {
            this.name = name;
        }
        public abstract void Add(Company c);
        public abstract void Remove(Company c);
        public abstract void Display(int depth);
        public abstract void LineOfDuty();//履行职责
    }

具体公司类:用于实现接口,发展下属分公司

    //具体公司类
    class ConcreteCompany:Company
    {
        private List<Company > children = new List<Company>();
        public ConcreteCompany(string name) : base(name)
        { }
        public override void Add(Company c)
        {
            children.Add(c);
        }
        public override void Remove(Company c)
        {
            children.Remove(c);
        }
        public override void Display(int depth) //显示
        {
            Console.WriteLine(new String('_',depth)+name);
            foreach (Company component in children ) 
            {
                component.Display(depth+2);
            }
        }
        public override void LineOfDuty()
        {
            foreach (Company component in children)
            {
                component.LineOfDuty();
            }
        }
    }

公司部门:无论是总公司还是分公司,都要有人力和财务这两个部门。

    //人力资源部
    class HRDepartment:Company
    {
        public HRDepartment(string name) : base(name)
        { }
        public override void Add(Company c)
        { }
        public override void Remove(Company c)
        { }
        public override void Display(int depth)
        {
            Console.WriteLine(new String('_', depth) + name);
        }
        public override void LineOfDuty()
        {
            Console.WriteLine("{0}员工招聘培训管理",name);
        }
    }
        //财务部
    class FinanceDepartment:Company
    {
        public FinanceDepartment(string name) : base(name)
        { }
        public override void Add(Company c)
        { }
        public override void Remove(Company c)
        { }
        public override void Display(int depth)
        {
            Console.WriteLine(new String('_', depth) + name);
        }
        public override void LineOfDuty()
        {
            Console.WriteLine("{0}公司财务收支管理", name);
        }
    }

客户端:

        static void Main(string[] args)
        { 
            ConcreteCompany root = new ConcreteCompany("北京总公司");
            root.Add(new HRDepartment ("总公司人力资源部"));
            root.Add(new FinanceDepartment ("总公司财务部"));
            ConcreteCompany comp = new ConcreteCompany("上海华东分公司");
            comp.Add(new HRDepartment ("华东分公司人力资源部"));
            comp.Add(new FinanceDepartment("华东分公司财务部"));
            root.Add(comp);//总部添加分公司的结构
            ConcreteCompany comp1 = new ConcreteCompany("南京办事处");
            comp1.Add(new HRDepartment("南京办事处人力资源部"));
            comp1.Add(new FinanceDepartment("南京办事处财务部"));
            root.Add(comp1);//总部添加办事处的结构
            ConcreteCompany comp2 = new ConcreteCompany("杭州办事处");
            comp2.Add(new HRDepartment("杭州办事处人力资源部"));
            comp2.Add(new FinanceDepartment("杭州办事处财务部"));
            root.Add(comp2);//总部添加办事处的结构
            Console.WriteLine("\n结构图:");
            root.Display(1);
            Console.WriteLine("\n职责:");
            root.LineOfDuty();
            Console.Read();
        }

显示结果:

相关文章
|
8月前
|
架构师 测试技术 Linux
嵌入式软件架构中抽象层设计方法
嵌入式软件架构中抽象层设计方法
251 0
|
6月前
|
缓存 项目管理
项目管理定义问题之DDD架构的分层架构中基础层作用是什么
项目管理定义问题之DDD架构的分层架构中基础层作用是什么
|
8月前
|
设计模式 编译器 数据安全/隐私保护
C++ 多级继承与多重继承:代码组织与灵活性的平衡
C++的多级和多重继承允许类从多个基类继承,促进代码重用和组织。优点包括代码效率和灵活性,但复杂性、菱形继承问题(导致命名冲突和歧义)以及对基类修改的脆弱性是潜在缺点。建议使用接口继承或组合来避免菱形继承。访问控制规则遵循公有、私有和受保护继承的原则。在使用这些继承形式时,需谨慎权衡优缺点。
199 1
|
8月前
|
设计模式 XML C++
C++组合模式探索:以统一接口管理复杂的层次结构
C++组合模式探索:以统一接口管理复杂的层次结构
128 1
|
设计模式 Java
构建复杂结构:解析Java设计模式中的组合模式
在软件开发领域,设计模式是一组经过验证的最佳实践方法,用于解决常见问题。组合模式是一种结构型设计模式,其目标是允许你将对象组合成树状结构,以表示“整体-部分”层次关系。在本文中,我们将深入了解组合模式的核心思想、应用场景以及它在Java中的实际运用。
95 0
|
消息中间件 前端开发 小程序
DDD实战之五:战略设计之上下文映射和系统分层架构(下)
DDD实战之五:战略设计之上下文映射和系统分层架构(下)
DDD实战之五:战略设计之上下文映射和系统分层架构(下)
|
缓存 算法 NoSQL
公司对不同职级能力抽象要求的具体化
要先把当前级别要求的能力提升到精通,然后尝试做下一级别的事情。
388 0
|
前端开发 小程序 机器人
DDD实战之五:战略设计之上下文映射和系统分层架构(上)
DDD实战之五:战略设计之上下文映射和系统分层架构(上)
DDD实战之五:战略设计之上下文映射和系统分层架构(上)
|
设计模式 开发框架 前端开发
设计概念的统一语言
设计概念的统一语言
|
供应链 微服务
单一的全球IT架构的抽象、创建和整合
单一的全球IT架构的抽象、创建和整合
203 0
单一的全球IT架构的抽象、创建和整合