码迷,mamicode.com
首页 > 其他好文 > 详细

结构型模式——组合模式

时间:2020-04-08 11:35:35      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:财务部   lin   pre   console   eof   种类型   https   容器   之间   

视频连接: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

结构型模式——组合模式

标签:财务部   lin   pre   console   eof   种类型   https   容器   之间   

原文地址:https://www.cnblogs.com/wq-7047/p/12658648.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!