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

组合模式(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)不容易用继承的方法来增加构件的新功能。

参考:https://www.cnblogs.com/libingql/p/3496345.html

原文地址:https://www.cnblogs.com/az4215/p/11602936.html

时间: 2024-07-30 17:30:22

设计模式-结构型-组合模式的相关文章

JAVA设计模式(10):结构型-组合模式(Composite)

先看看组合模式的定义吧:"将对象组合成树形结构以表示'部分-整体'的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性." /** * 抽象组件 */ public interface Component { void operation(); } /** * 叶子组件 */ interface Leaf extends Component{ } /** * 容器组件 */ interface Composite extends Component{ } public in

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

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之桥接模式(Bridge Pattern)> http://blog.csdn.net/yanbober/article/details/45366781 概述 组合模式又叫做部分-整体模式,使我们在树型结构的问题中模糊简单元素和复杂元素的概念,客户程序可以像

C#设计模式之九组合模式(Composite Pattern)【结构型】

原文:C#设计模式之九组合模式(Composite Pattern)[结构型] 一.引言 今天我们要讲[结构型]设计模式的第四个模式,该模式是[组合模式],英文名称是:Composite Pattern.当我们谈到这个模式的时候,有一个物件和这个模式很像,也符合这个模式要表达的意思,那就是"俄罗斯套娃"."俄罗斯套娃"就是大的瓷器娃娃里面装着一个小的瓷器娃娃,小的瓷器娃娃里面再装着更小的瓷器娃娃,直到最后一个不能再装更小的瓷器娃娃的那个瓷器娃娃为止(有点绕,下面我会

设计模式——结构型模式

设计模式的另一大类型为结构型.共收录了7个模式,分别为适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式.下面从特点和使用两方面小探,欢迎交流!      适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.[大话设计模式]        特点:需要交流的两方,在数据和行为都匹配,但接口不符时,我们应该考虑用适配器,目的是促使交流和复用.可以理解为入乡随俗,相同的意思,不同的表达

设计模式(结构型)之装饰者模式(Decorator Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之组合模式(Composite Pattern)>http://blog.csdn.net/yanbober/article/details/45392513 概述 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为.装饰模式是一种用于替代继承

设计模式(结构型)之享元模式(Flyweight Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之外观模式(Facade Pattern)>http://blog.csdn.net/yanbober/article/details/45476527 概述 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题.所以需要采用一

设计模式(结构型)之外观模式(Facade Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之装饰者模式(Decorator Pattern)>http://blog.csdn.net/yanbober/article/details/45395747 概述 一个客户类需要和多个业务类交互,而这些业务类经常会作为整体出现,由于涉及到的类比较多,导致使

设计模式(结构型)之代理模式(Proxy Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之享元模式(Flyweight Pattern)>http://blog.csdn.net/yanbober/article/details/45477551 概述 代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个

设计模式C++实现——组合模式

模式定义: 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 这个模式能够创建一个树形结构,在同一个结构中处理嵌套菜单和菜单项组.通过菜单和项放在相同结构中,我们创建了一个"整体/部分"层次结构,即由菜单和菜单项组成的对象树.使用组合结构,我们能把相同的操作应用在组合和个别对象上.换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别. 模式结构: Component: 为组合中的对象声明