组合模式 傷城~ 2021-12-09 00:49 296阅读 0赞 ## 前言 ## **组合模式(Composite)**,将对象组合树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 ## 一、Component 类 ## Component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的子部件。 1 public abstract class Component 2 { 3 protected string name; 4 public Component(string name) 5 { 6 this.name = name; 7 } 8 //通常用add方法来提供增加树叶或树枝的功能 9 public abstract void Add(Component c); 10 //通常用remove方法来提供移除树叶或树枝的功能 11 public abstract void Remove(Component c); 12 public abstract void Display(int depth); 13 } ## 二、Leaf在组合中表示叶节点对象,叶节点没有子节点。 ## ** 由于叶子没有再增加分支和树叶,所以add和remove方法实现它没有意义,但这样做可以消除叶节点和枝节点对象在抽象层次的区别,他们具备完全一致的接口。** 1 public class Leaf : Component 2 { 3 public Leaf(string name) : base(name) 4 { 5 } 6 7 public override void Add(Component c) 8 { 9 Console.WriteLine("不需要添加树叶"); 10 } 11 12 public override void Display(int depth) 13 { 14 Console.WriteLine(new string('-', depth) + name); 15 } 16 17 public override void Remove(Component c) 18 { 19 Console.WriteLine("不需要移除树叶"); 20 } 21 } ## 三、Composite类 ## Composite定义有枝节点行为,用来存储子部件,在component接口中实现与子部件有关的操作。 1 public class Composite : Component 2 { 3 private List<Component> children = new List<Component>(); 4 public Composite(string name) : base(name) 5 { 6 } 7 8 public override void Add(Component c) 9 { 10 children.Add(c); 11 } 12 13 public override void Display(int depth) 14 { 15 Console.WriteLine(new string('-', depth) + name); 16 foreach(var c in children) 17 { 18 c.Display(depth + 2); 19 } 20 } 21 22 public override void Remove(Component c) 23 { 24 children.Remove(c); 25 } 26 } ## 四、客户端 ## 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //生成树根root,根上长出两叶leafA和leafB 6 Composite root = new Composite("root"); 7 root.Add(new Leaf("Leaf A")); 8 root.Add(new Leaf("Leaf B")); 9 10 //根上 长出分支Composite X,分支上也有两叶leafXA和leafXB 11 Composite comp = new Composite("Composite X"); 12 comp.Add(new Leaf("Leaf XA")); 13 comp.Add(new Leaf("Leaf XB")); 14 15 root.Add(comp); 16 17 //Composite X再长出分支Composite XY,分支上也有两只leafXYA和leafXYB 18 Composite comp2 = new Composite("Composite XY"); 19 comp2.Add(new Leaf("Leaf XYA")); 20 comp2.Add(new Leaf("Leaf XYB")); 21 22 comp.Add(comp2); 23 24 //根上又长出两叶LeafC和LeafD 25 root.Add(new Leaf("Leaf C")); 26 //leafD 没长好 被吃了 27 Leaf leaf = new Leaf("Leaf D"); 28 root.Add(leaf); 29 root.Remove(leaf); 30 31 root.Display(1); 32 33 Console.ReadKey(); 34 } 35 } ## 总结 ## 1、**透明模式:**在Component中声明所有用来管理子对象的方法,其中Add,Remove等,这样实现Component接口的所有子类都具备了Add和Remove。这样做的好处就是叶节点和枝节点对外没有区别。他们具有完备统一的接口。但问题也很明显,因为Leaf类本身不具备Add()、Remove()方法的功能,所以实现它没有意义的。 2、**安全模式:** 在Component接口中不去声明Add和Remove方法,那么子类的leaf也就不需要去实现它,而Composite声明所有用来管理子类对象的方法,这样做就不会出现刚才提到的问题,不过由于不透明,所以树叶和树枝类将不具备相同的接口,客户端的调用需要做相应的判断,带来不便。 3、当你发现需求中使体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象 与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式。 **参考书籍:**大话设计模式
相关 组合模式 在我写外观模式的时候,我是举最近在做的一个考勤的例子,不熟悉的小伙伴可以去看一下前面的文章哦,在那个例子中我们分析了一下,考勤中每种类别员工的工作日计算方式是不一样的,比如说一 川长思鸟来/ 2022年05月09日 15:00/ 0 赞/ 230 阅读
相关 组合模式 组合模式 一、概述 1. 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组 合,使得用户在使用时可以一致性的对待容器和叶子。 2. 古城微笑少年丶/ 2022年04月18日 04:47/ 0 赞/ 210 阅读
相关 组合模式 > 本文总结摘自刘伟老师的《设计模式》和程杰老师的《大话设计模式》 1.定义 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个 朴灿烈づ我的快乐病毒、/ 2022年01月23日 00:21/ 0 赞/ 253 阅读
相关 组合模式 前言 组合模式(Composite),将对象组合树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 一、Compone 傷城~/ 2021年12月09日 00:49/ 0 赞/ 297 阅读
相关 组合模式 树形结构在软件中十分常见,如操作系统中的文件结构,文件夹包含文件和子文件夹,而子文件夹又包含文件和子子文件夹,像这样的结构称为树形结构。在树形结构中,文件夹或子文件夹称为容器( 清疚/ 2021年11月04日 16:10/ 0 赞/ 365 阅读
相关 组合模式 用途 -------------------- 组合模式 (Component) 将对象组合成 树形结构以表示“部分-整体”的层次结构。 组合模式使得用户对单个对象和 以你之姓@/ 2021年09月26日 15:50/ 0 赞/ 286 阅读
相关 组合模式 组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 透明方式:就是在component中声明所有用来管理子对 r囧r小猫/ 2021年09月17日 03:18/ 0 赞/ 430 阅读
相关 组合模式 11.组合模式 ![70][] //抽象构件,它是叶子和容器共同的父类,并且声明了叶子和容器的所有方法 abstract class Abstr 末蓝、/ 2021年09月16日 23:58/ 0 赞/ 369 阅读
相关 组合模式 一 概述 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nL 你的名字/ 2021年07月24日 17:14/ 0 赞/ 546 阅读
相关 组合模式 合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类... 小灰灰/ 2020年06月13日 05:57/ 0 赞/ 805 阅读
还没有评论,来说两句吧...