1、在面向对象
系统中,我们常会遇到一类具有“容器”特征的对象——即它们在充当对象的同时,又是其他对象的容器。
如何将“客户代码与复杂的对象容器结构”解耦(将这种组合容器对象设计成树形结构,从而可以对下面所有的容器都可以通过最上层 的根对象 实现 统一 的调用,进而客户端就不在乎 其内部是怎么实现的,耦合 降低了)?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?
2、意图
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。(通过 树根对象的 执行方法,从而调用 他下面的所有的子节点)
3、结构图
4、代码演示
业务实现:
复制代码
1 ///
2 /// 抽象的统一 入口
3 ///
4 public abstract class AbsCompany
5 {
6 protected string Name { set; get; }
7
8 public AbsCompany(string str)
9 {
10 this.Name = str;
11 }
12
13 public abstract void Add(AbsCompany item);
14
15 public abstract void Remove(AbsCompany item);
16
17 public abstract void Show();
18
19 public abstract void DoDuty();
20
21 //增加子节点的 方式可以 设置 父节点属性
22 public AbsCompany Father { set; get; }
23
24 }
25
26 ///
27 /// 叶子节点1
28 ///
29 public class HRPart : AbsCompany
30 {
31 public HRPart(string name)
32 : base(name)
33 {
34 }
35 //叶子节点不能实现 增删节点操作
36 public override void Add(AbsCompany item)
37 {
38 throw new InvalidOperationException("叶子节点不允许操作");
39 }
40
41 public override void Remove(AbsCompany item)
42 {
43 throw new InvalidOperationException("叶子节点不允许操作");
44 }
45
46 public override void Show()
47 {
49 }
50
51 public override void DoDuty()
52 {
53 Console.WriteLine(base.Name+":致力于招募人才");
54 }
55 }
56
57
58 ///
59 /// 叶子节点2
60 ///
61 public class MoneyPart : AbsCompany
62 {
63 public MoneyPart(string name)
64 : base(name)
65 {
66 }
67
68 //叶子节点不能实现 增删节点的操作
69 public override void Add(AbsCompany item)
70 {
71 throw new InvalidOperationException("叶子节点不允许操作");
72 }
73
74 public override void Remove(AbsCompany item)
75 {
76 throw new InvalidOperationException("叶子节点不允许操作");
77 }
78
79 public override void Show()
80 {
81 Console.WriteLine("财务部分:"+base.Name);
82 }
83
84 public override void DoDuty()
85 {
86 Console.WriteLine(base.Name+":致力于管理好公司的财务");
87 }
88 }
89
90 ///
91 /// 树形节点(Composite)
92 ///
93 public class Company : AbsCompany
94 {
95 public Company(string name)
96 : base(name)
97 {
98 }
99
100 //对应 上级节点是 聚合关系
101 private List items = new List();
102
103
104 public override void Add(AbsCompany item)
105 {
106 items.Add(item);
107
108 //父节点方式:增加子节点
109 item.Father = this;
110 }
111
112 public override void Remove(AbsCompany item)
113 {
114 items.Remove(item);
115
116 //父节点 方式 :删除子节点:
117 item.Father = null;//此节点没有父节点了,因此它的父节点下面就没有这个子节点了
118 }
119 ///
120 /// 实现了加载 次节点下面的所有节点