欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式-结构型-组合模式

程序员文章站 2022-05-18 20:15:34
组合模式(Composite): 定义: 组合模式又叫部分整体模式,它是一种将对象组合成树状的层次结构模式,用来表示"部分-整体"的关系,使用户对单个对象和组合对象具有一致的访问性。 组合模式的角色: 1)抽象构建(Component):它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默 ......

组合模式(composite):

定义:

  组合模式又叫部分整体模式,它是一种将对象组合成树状的层次结构模式,用来表示"部分-整体"的关系,使用户对单个对象和组合对象具有一致的访问性。

组合模式的角色:

  1)抽象构建(component):它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。

  2)树叶构件(leaf):是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。

  3)树枝构件(composite):是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 add()、remove()、getchild() 等方法。

  设计模式-结构型-组合模式

 1 internal class program
 2 {
 3     private static void main(string[] args)
 4     {
 5         // create a tree structure
 6         composite root = new composite("root");
 7         root.add(new leaf("leaf a"));
 8         root.add(new leaf("leaf b"));
 9 
10         composite comp = new composite("composite x");
11         comp.add(new leaf("leaf xa"));
12         comp.add(new leaf("leaf xb"));
13 
14         root.add(comp);
15         root.add(new leaf("leaf c"));
16 
17         // add and remove a leaf
18         leaf leaf = new leaf("leaf d");
19         root.add(leaf);
20         root.remove(leaf);
21 
22         // recursively display tree
23         root.display(1);
24     }
25 }
26 
27 public abstract class component
28 {
29     protected string _name;
30 
31     public component(string name)
32     {
33         this._name = name;
34     }
35 
36     public abstract void add(component c);
37 
38     public abstract void remove(component c);
39 
40     public abstract void display(int depth);
41 }
42 
43 public class leaf : component
44 {
45     public leaf(string name)
46         : base(name)
47     {
48     }
49 
50     public override void add(component c)
51     {
52         console.writeline("cannot add to a leaf");
53     }
54 
55     public override void remove(component c)
56     {
57         console.writeline("cannot remove from a leaf");
58     }
59 
60     public override void display(int depth)
61     {
62         console.writeline(new string('-', depth) + _name);
63     }
64 }
65 
66 public class composite : component
67 {
68     private list<component> _children = new list<component>();
69 
70     public composite(string name)
71         : base(name)
72     {
73     }
74 
75     public override void add(component component)
76     {
77         _children.add(component);
78     }
79 
80     public override void remove(component component)
81     {
82         _children.remove(component);
83     }
84 
85     public override void display(int depth)
86     {
87         console.writeline(new string('-', depth) + _name);
88 
89         foreach (component component in _children)
90         {
91             component.display(depth + 2);
92         }
93     }
94 }

 极简版如下,将显示部分可以拿到客户端进行:

 1 internal class program
 2 {
 3     private static void main(string[] args)
 4     {
 5         // create a tree structure
 6         component root = new component("root");
 7         root.add(new component("leaf a"));
 8         root.add(new component("leaf b"));
 9 
10         component comp = new component("composite x");
11         comp.add(new component("leaf xa"));
12         comp.add(new component("leaf xb"));
13 
14         root.add(comp);
15         root.add(new component("leaf c"));
16 
17         // add and remove a leaf
18         component leaf = new component("leaf d");
19         root.add(leaf);
20         root.remove(leaf);
21 
22         // 由客户端显示,component只进行组合
23     }
24 }
25 
26 public class component
27 {
28     protected string _name;
29     private list<component> _children = new list<component>();
30 
31     public component(string name)
32     {
33         this._name = name;
34     }
35 
36     public void add(component c)
37     {
38         _children.add(c);
39     }
40 
41     public void remove(component c)
42     {
43         _children.remove(c);
44     }
45 
46     public list<component> getchild()
47     {
48         return _children;
49     }
50 }

是不是恍然大悟,就是我们在做权限管理的时候用到的一对多的关系。

组合模式的优缺点:

  优点:

    1)组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的单个对象还是组合对象,这简化了客户端代码;

    2)更容易在组合体内加入新的对象,客户端不会因为加入新的对象而更改源代码,满足ocp原则。

  缺点:

    1)设计较复杂,客户端需要花更多的时间理清类之间的层次关系;

    2)不容易限制容器中的构件;

    3)不容易用继承的方法来增加构件的新功能。

参考: