概述:
组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
将对象组合成树形结构以表示“部分-整体”的层次结构。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();
}
}
|
写到这里我们会发现,设计模式大多数都可以通用,同一种业务可以用很多种设计模式来做,但是只要我们弄清楚适用场景,就能选出一个更合适我们需求的设计模式。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。