设计模式之组合模式,温故而知新。
概述:
组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。[GOF 《设计模式》]
结构图:
举例:
假设我们公司有做个打卡的程序,能满足各种打卡的需要,比如整个公司能打卡,个人也能打卡(外包人员一个人支起一片天)。我们看看用组合模式是怎么实现的,这里不就讲怎么演化的了!演化的过程比较容易误导。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
public abstract class Company { protected string companyName; public string CompanyName { get { return companyName; } set { companyName = value; } } //添加公司 public abstract void Add(Company name); //移除公司 public abstract void Remove(Company name); //打卡 public abstract void Register(); } //个人 public class Personal : Company { private string _name; public Personal( string name) { _name = name; } public override void Add(Company name) { //个人添加的能力,所以不实现 throw new NotImplementedException(); } public override void Remove(Company name) { //没有添加功能,所以不能删除 throw new NotImplementedException(); } //打卡 public override void Register() { Console.WriteLine( "{0}打卡了" ,_name); } } //一个公司 public class WholeCompany : Company { List<Company> myList = new List<Company>(); public override void Add(Company name) { myList.Add(name); } public override void Remove(Company name) { myList.Remove(name); } public override void Register() { Console.WriteLine( "{0}" , companyName); foreach (var item in myList) { item.Register(); } } } |
我们看看 客户端怎么调用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class Program { static void Main( string [] args) { Company reg = new WholeCompany(); reg.CompanyName = "本日打卡开始" ; //个体用户 Personal p1 = new Personal( "小A" ); Company p2 = new Personal( "小B" ); reg.Add(p1); reg.Add(p2); //公司用户 WholeCompany beijing = new WholeCompany(); beijing.CompanyName = "北京分公司" ; beijing.Add( new Personal( "北京小王" )); beijing.Add( new Personal( "北京小黑" )); reg.Add(beijing); reg.Register(); Console.ReadLine(); } } |
执行结果:
写到这里我们会发现,设计模式大多数都可以通用,同一种业务可以用很多种设计模式来做,但是只要我们弄清楚适用场景,就能选出一个更合适我们需求的设计模式。
适用性:
以下情况下适用Composite模式:
1.你想表示对象的部分-整体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。