[Head First设计模式]生活中学设计模式——组合模式

系列文章

[Head First设计模式]山西面馆中的设计模式——装饰者模式

[Head First设计模式]山西面馆中的设计模式——观察者模式

[Head First设计模式]山西面馆中的设计模式——建造者模式

[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

[Head First设计模式]一个人的平安夜——单例模式

[Head First设计模式]抢票中的设计模式——代理模式

[Head First设计模式]面向对象的3特征5原则

[Head First设计模式]鸭子模型——策略模式

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

[Head First设计模式]餐馆中的设计模式——命令模式

[Head First设计模式]身边的设计模式——适配器模式

[Head First设计模式]生活中学设计模式——迭代器模式

引言

比如:复制文件,可以一个一个文件复制粘贴也可以整个文件夹进行复制粘贴。

组合模式

允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

类图

角色

Component:为组合中的对象声明接口。

Leaf:在组合中表示没有子节点的叶节点。

Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。

适用场景

希望把对象表示成整体-部分层次结构。

希望永固忽略组合对象与单个对象的不同,用户将统一使用组合结构中所有对象。

优点

基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去。客户代码中,任何用到基本对象的地方都可以使用组合对象。

客户可以一致的使用组合结构和单个对象。这样用户就不必关心处理的是一个叶节点还是一个组合组件。这样就大大简化了客户代码。

新定义的Componnt或Leaf子类自动地与已有的结构和客户代码一起协同工作,客户程序不需要因新的Component类而改变。

缺点

直接使用了实现类,在面向抽象编程上是很不恰当的,与依赖倒置原则冲突。

一个例子

 比如oa系统中最常见的组织结构关系:

 1 namespace Wolfy.组合模式
 2 {
 3     /// <summary>
 4     /// 抽象接口类
 5     /// </summary>
 6     public abstract class Company
 7     {
 8         public Company(string name)
 9         { this.Name = name; }
10         public string Name { get; set; }
11         public abstract void Add(Company company);
12         public abstract void Remove(Company company);
13         public abstract void Display(int depth);
14     }
15 }

 1 namespace Wolfy.组合模式
 2 {
 3     /// <summary>
 4     /// 叶节点 子公司 部门类
 5     /// </summary>
 6    public  class ConcreteCompany:Company
 7     {
 8        private List<Company> list= new List<Company>();
 9        public ConcreteCompany(string name)
10            : base(name)
11        {  }
12        public override void Add(Company company)
13         {
14             list.Add(company);
15         }
16
17         public override void Remove(Company company)
18         {
19             list.Remove(company);
20         }
21
22         public override void Display(int depth)
23         {
24             StringBuilder sb = new StringBuilder();
25             for (int i = 0; i < depth; i++)
26             {
27                 sb.Append("-");
28             }
29             Console.WriteLine(sb.ToString()+base.Name);
30             Console.WriteLine();
31             foreach (Company item in list)
32             {
33                 item.Display(depth + 2);
34             }
35         }
36     }
37 }

 1 namespace Wolfy.组合模式
 2 {
 3     /// <summary>
 4     /// 叶节点类 人事部
 5     /// </summary>
 6     public class HRDepartment:Company
 7     {
 8         public HRDepartment(string name)
 9             : base(name)
10         { }
11         public override void Add(Company company)
12         {
13             throw new NotImplementedException();
14         }
15
16         public override void Remove(Company company)
17         {
18             throw new NotImplementedException();
19         }
20
21         public override void Display(int depth)
22         {
23
24             Console.WriteLine(new String('-', depth) + base.Name);
25
26             Console.WriteLine();
27         }
28     }
29 }

 1 namespace Wolfy.组合模式
 2 {
 3     /// <summary>
 4     /// 叶节点 财务部
 5     /// </summary>
 6     public class FinanceDepartment:Company
 7     {
 8         public FinanceDepartment(string name) : base(name) { }
 9         public override void Add(Company company)
10         {
11             throw new NotImplementedException();
12         }
13
14         public override void Remove(Company company)
15         {
16             throw new NotImplementedException();
17         }
18
19         public override void Display(int depth)
20         {
21             Console.WriteLine(new String('-', depth) + base.Name);
22             Console.WriteLine();
23         }
24     }
25 }

 1 namespace Wolfy.组合模式
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Company root = new ConcreteCompany("北京总公司");
 8             root.Add(new HRDepartment("总公司人力资源部"));
 9             root.Add(new FinanceDepartment("总公司财务部"));
10             Company shandongCom = new ConcreteCompany("山东分公司");
11             shandongCom.Add(new HRDepartment("山东分公司人力资源部"));
12             shandongCom.Add(new FinanceDepartment("山东分公司账务部"));
13             Company zaozhuangCom = new ConcreteCompany("枣庄办事处");
14             zaozhuangCom.Add(new FinanceDepartment("枣庄办事处财务部"));
15             zaozhuangCom.Add(new HRDepartment("枣庄办事处人力资源部"));
16             Company jinanCom = new ConcreteCompany("济南办事处");
17             jinanCom.Add(new FinanceDepartment("济南办事处财务部"));
18             jinanCom.Add(new HRDepartment("济南办事处人力资源部"));
19             shandongCom.Add(jinanCom);
20             shandongCom.Add(zaozhuangCom);
21             Company huadongCom = new ConcreteCompany("上海华东分公司");
22             huadongCom.Add(new HRDepartment("上海华东分公司人力资源部"));
23             huadongCom.Add(new FinanceDepartment("上海华东分公司账务部"));
24             Company hangzhouCom = new ConcreteCompany("杭州办事处");
25             hangzhouCom.Add(new FinanceDepartment("杭州办事处财务部"));
26             hangzhouCom.Add(new HRDepartment("杭州办事处人力资源部"));
27             Company nanjingCom = new ConcreteCompany("南京办事处");
28             nanjingCom.Add(new FinanceDepartment("南京办事处财务部"));
29             nanjingCom.Add(new HRDepartment("南京办事处人力资源部"));
30             huadongCom.Add(hangzhouCom);
31             huadongCom.Add(nanjingCom);
32             root.Add(shandongCom);
33             root.Add(zaozhuangCom);
34             root.Add(jinanCom);
35             root.Add(huadongCom);
36             root.Add(hangzhouCom);
37             root.Add(nanjingCom);
38             root.Display(0);
39             Console.Read();
40         }
41     }
42 }

 

结果:

 

总结

优点

基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去。客户代码中,任何用到基本对象的地方都可以使用组合对象。

客户可以一致的使用组合结构和单个对象。这样用户就不必关心处理的是一个叶节点还是一个组合组件。这样就大大简化了客户代码。

新定义的Componnt或Leaf子类自动地与已有的结构和客户代码一起协同工作,客户程序不需要因新的Component类而改变。

缺点

直接使用了实现类,在面向抽象编程上是很不恰当的,与依赖倒置原则冲突。

参考:

《Head First 设计模式》

百度百科

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。

转载:http://www.cnblogs.com/wolf-sun/p/3636768.html

时间: 2024-12-02 14:12:45

[Head First设计模式]生活中学设计模式——组合模式的相关文章

[Head First设计模式]生活中学设计模式——外观模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 [Head First设计模式]抢票中的设计模式--代理模式 [Head First设计模式]面向对象的3特征5原则 [Head First设计模式]鸭子

[Head First设计模式]生活中学设计模式——状态模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 [Head First设计模式]抢票中的设计模式--代理模式 [Head First设计模式]面向对象的3特征5原则 [Head First设计模式]鸭子

[Head First设计模式]生活中学设计模式——迭代器模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 [Head First设计模式]抢票中的设计模式--代理模式 [Head First设计模式]面向对象的3特征5原则 [Head First设计模式]鸭子

设计模式(七)组合模式Composite(结构型)

设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象.客户端代码必须区别对象简单对象和容器对象,而实际上大多数情况下用户认为它们是一样的.对这些类区别使用,使得程序更加复杂.递归使用的时候跟麻烦,而我们如何

Java设计模式(十一)----组合模式

组合模式 一.定义 二.结构 三.具体案例 四.适用性 五.总结 一.定义 将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对象和使用具有一致性. 二.结构 类图 角色: 1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为.声明一个接口用于访问和管Component 2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点. 3.Composite 定义有子节点行为,用来存储子部件,在Component接口中实现与子部

设计模式详解之组合模式

组合模式(Composite):组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便,看看关系图: public class TreeNode { private String name; private TreeNode parent; private Vector<TreeNode> children = new Vector<TreeNode>(); public TreeNode(String name){ this.name = name; } public

设计模式:组合模式(Composite)

将对象组合成属性结构以表示"部分-整体"的层次结构.组合使得用户和单个对象和组合对象的使用具有一致性. 组合模式设计的角色: 1. Component:是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为.声明一个接口用于访问和管理Component. 2. Leaf:在组合中表示叶子节点对象,叶子节点没有子节点. 3. Composite:定义树枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加和删除等. 举个简单例子(树枝和叶子) 1

C# 设计模式系列教程-组合模式_C#教程

1. 概述 将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 2. 解决的问题 当希望忽略单个对象和组合对象的区别,统一使用组合结构中的所有对象(将这种"统一"性封装起来). 3. 组合模式中的角色 3.1 组合部件(Component):它是一个抽象角色,为要组合的对象提供统一的接口. 3.2 叶子(Leaf):在组合中表示子节点对象,叶子节点不能有子节点. 3.3 合成部件(Composite):定义有枝

.NET设计模式(11):组合模式(Composite Pattern)

概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite模式使得用户对单个对象和组合对象的使用具有一致性.[GOF <设计模式>] 结构图 图1 Composite模式结构图 生活中的例子 组合模式将对象组合成树形结构以表示"部分-整体"的层次结构