结构型模式——组合模式

Posted wq-7047

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构型模式——组合模式相关的知识,希望对你有一定的参考价值。

视频连接:B站审核中……

1定义

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

2作用与意义

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

l  主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

l  何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

l  如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

组合模式的目的是:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。实现这个目标的关键之处,是设计一个抽象的组件类,让它可以代表组合对象和叶子对象。这样一来,客户端就不用区分到底是组合对象还是叶子对象了,只需要全部当成组件对象进行统一的操作就可以了。

  1. 统一元素与部分整体,简化处理代码。
  2. 将元素内部结构同处理程序解耦,从而一致的对待元素与部分整体。
  3. 实际上,组合模式在应用中其实非常广泛,像文件系统、企业结构等都可以看做是组合模式的典型应用。
  4. Component:定义成接口或者抽象类,是元素与不部分整体的父类。
  5. Leaf:叶子节点,定义了基本元素的特征,继承自Component父类,是整体最基本的组成部分。
  6. Composite:部分整体或者容器,继承或实现自Component父类。内部包含Composite或者Leaf的聚合,用来保存内部的组织结构,并且针对该聚合有相应的操作方法。

 技术图片

组合模式(Component)结构图

3应用

  1. 在对象与部分整体之间,想要通过统一的方式对其进行处理,模糊处理其差异的时候可以选用组合模式。
  2. 当客户端忽视结构层次,无差异的看待元素与部分整体,不关心元素和部分整体之间的层次结构,想要实现对统一接口编程的时候。
  3. 对象的变化是动态,而客户端想要一致的处理对象的时候。
  4. 组合模式意图是通过整体与局部之间的关系,通过树形结构的形式进行组织复杂对象,屏蔽对象内部的细节,对外展现统一的方式来操作对象,是我们处理更复杂对象的一个手段和方式。公司OA系统如何进行设计有关于此。   

综上,在上述几种情况下可以考虑使用组合模式来设计系统程序。组合模式关键定义了一个抽象类或者接口,既可以代表元素又可以代表部分整体,而客户端是针对该接口进行编程。

 

4案例实现

例:公司管理系统

 技术图片

公司管理系统结构图

公司类 抽象类或接口

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 dapth)
    {
        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 dapth)
    {
        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 dapth)
    {
        Console. WriteLine (new String(- ,depth) + name) ;    
    }
    public override void LineOfDuty ()
    {
        Console. WriteLine (“{0} 公司财务收支管理”,name) ;
    }
}

组合模式定义了包含人力资源部和财务部这些基本对象和分公司、办事处等组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,这样在客户代码中,任何用到基本对象的地方都可以使用组合对象了。

参考链接:

https://wiki.mbalib.com/wiki/Composite_pattern

https://www.runoob.com/design-pattern/composite-pattern.html

以上是关于结构型模式——组合模式的主要内容,如果未能解决你的问题,请参考以下文章

结构型模式-组合模式(树形结构的处理)

Python 设计模式 — 结构型模式 — 组合模式

Python 设计模式 — 结构型模式 — 组合模式

设计模式 结构型模式 -- 组合模式实例:显示文件夹结构

设计模式组合模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

在组合模式中实现访问者(Visitor)模式