组合模式 r囧r小猫 2021-09-17 03:18 430阅读 0赞 组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 透明方式:就是在component中声明所有用来管理子对象的方法,其中包括add,remove等,这样实现的Component接口的所有子类都具有add和remove,这样的好处是叶子节点和枝节点对于外界没有区别,他们具有完全一致的接口行为。但是问题也很突出,叶子节点不具有add和remove的功能,所以实现它也没有什么意义。 安全方式:Component接口中不去声明add和remove方法,那么子类的Leaf也就不需要去实现它,而是在Composite声明所有用来管理子类对象的方法,由于不够透明,所以叶子节点和枝节点将有不同的接口,客户端调用时需要做相应的判断,增加使用难度和不便。 **应用实例:** 1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作符也可以是操作数、操作符和另一个操作数。 2、在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。 实例UML图: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdfc2h1eXU_size_16_color_FFFFFF_t_70][] 代码实现: /** * @author Shuyu.Wang * @package:com.shuyu.composite * @description:组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为,声明一个接口用于访问和管理Component的子部件 * @date 2018-11-28 13:27 **/ public abstract class Component { protected String name; public Component(String name){ this.name=name; } abstract void add(Component component); abstract void remove(Component component); abstract void display(int depth); } /** * @author Shuyu.Wang * @package:com.shuyu.composite * @description:拼接字符串- * @date 2018-11-28 13:58 **/ public class AppendString { public static String appendChar(String chars,int depth){ if (depth<1){ return null; } StringBuffer stringBuffer=new StringBuffer(); for(int i=0;i<depth;i++){ stringBuffer.append(chars); } return stringBuffer.toString(); } } /** * @author Shuyu.Wang * @package:com.shuyu.composite * @description:在组合中表示叶子节点对象,叶子节点没有子节点 * @date 2018-11-28 13:36 **/ @Slf4j public class Leaf extends Component { public Leaf(String name) { super(name); } @Override public void add(Component component) { log.error("cannot add to a leaf"); } @Override public void remove(Component component) { log.error("cannot remove to a leaf"); } @Override public void display(int depth) { log.info(AppendString.appendChar("-",depth) + name); } } /** * @author Shuyu.Wang * @package:com.shuyu.composite * @description:定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作,比如增加节点和移除节点 * @date 2018-11-28 13:40 **/ @Slf4j public class Composite extends Component { private List<Component> children = new ArrayList<Component>(); public Composite(String name) { super(name); } @Override public void add(Component component) { children.add(component); } @Override public void remove(Component component) { children.remove(component); } @Override public void display(int depth) { log.info(AppendString.appendChar("-",depth)+ name); for (Component c : children) { c.display(depth + 2); } } } 测试代码: @RunWith(SpringRunner.class) @SpringBootTest public class CompositeApplicationTests { @Test public void contextLoads() { Composite root=new Composite("root"); root.add(new Leaf("Leaf A")); root.add(new Leaf("Leaf B")); Composite comp=new Composite("Composite X"); comp.add(new Leaf("Leaf XA")); comp.add(new Leaf("Leaf XB")); root.add(comp); Composite comp2=new Composite("Composite XY"); comp2.add(new Leaf("Leaf XYA")); comp2.add(new Leaf("Leaf XYB")); comp.add(comp2); root.add(new Leaf("Leaf C")); Leaf leaf=new Leaf("Leaf D"); root.add(leaf); root.remove(leaf); root.display(1); } } 执行结果: 2018-11-28 14:01:54.271 INFO 22368 --- \[ main\] com.shuyu.composite.Composite : -root 2018-11-28 14:01:54.272 INFO 22368 --- \[ main\] com.shuyu.composite.Leaf : ---Leaf A 2018-11-28 14:01:54.272 INFO 22368 --- \[ main\] com.shuyu.composite.Leaf : ---Leaf B 2018-11-28 14:01:54.272 INFO 22368 --- \[ main\] com.shuyu.composite.Composite : ---Composite X 2018-11-28 14:01:54.272 INFO 22368 --- \[ main\] com.shuyu.composite.Leaf : -----Leaf XA 2018-11-28 14:01:54.272 INFO 22368 --- \[ main\] com.shuyu.composite.Leaf : -----Leaf XB 2018-11-28 14:01:54.272 INFO 22368 --- \[ main\] com.shuyu.composite.Composite : -----Composite XY 2018-11-28 14:01:54.272 INFO 22368 --- \[ main\] com.shuyu.composite.Leaf : -------Leaf XYA 2018-11-28 14:01:54.272 INFO 22368 --- \[ main\] com.shuyu.composite.Leaf : -------Leaf XYB 2018-11-28 14:01:54.272 INFO 22368 --- \[ main\] com.shuyu.composite.Leaf : ---Leaf C github代码地址:[https://github.com/iot-wangshuyu/designpatterns/tree/master/composite][https_github.com_iot-wangshuyu_designpatterns_tree_master_composite] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdfc2h1eXU_size_16_color_FFFFFF_t_70]: /images/20210901/cccb0d6bc0b744c2806bb4b27c07f5f9.png [https_github.com_iot-wangshuyu_designpatterns_tree_master_composite]: https://github.com/iot-wangshuyu/designpatterns/tree/master/composite
相关 组合模式 在我写外观模式的时候,我是举最近在做的一个考勤的例子,不熟悉的小伙伴可以去看一下前面的文章哦,在那个例子中我们分析了一下,考勤中每种类别员工的工作日计算方式是不一样的,比如说一 川长思鸟来/ 2022年05月09日 15:00/ 0 赞/ 231 阅读
相关 组合模式 组合模式 一、概述 1. 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组 合,使得用户在使用时可以一致性的对待容器和叶子。 2. 古城微笑少年丶/ 2022年04月18日 04:47/ 0 赞/ 210 阅读
相关 组合模式 > 本文总结摘自刘伟老师的《设计模式》和程杰老师的《大话设计模式》 1.定义 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个 朴灿烈づ我的快乐病毒、/ 2022年01月23日 00:21/ 0 赞/ 254 阅读
相关 组合模式 前言 组合模式(Composite),将对象组合树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 一、Compone 傷城~/ 2021年12月09日 00:49/ 0 赞/ 297 阅读
相关 组合模式 树形结构在软件中十分常见,如操作系统中的文件结构,文件夹包含文件和子文件夹,而子文件夹又包含文件和子子文件夹,像这样的结构称为树形结构。在树形结构中,文件夹或子文件夹称为容器( 清疚/ 2021年11月04日 16:10/ 0 赞/ 366 阅读
相关 组合模式 用途 -------------------- 组合模式 (Component) 将对象组合成 树形结构以表示“部分-整体”的层次结构。 组合模式使得用户对单个对象和 以你之姓@/ 2021年09月26日 15:50/ 0 赞/ 286 阅读
相关 组合模式 组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 透明方式:就是在component中声明所有用来管理子对 r囧r小猫/ 2021年09月17日 03:18/ 0 赞/ 431 阅读
相关 组合模式 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 赞/ 547 阅读
相关 组合模式 合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类... 小灰灰/ 2020年06月13日 05:57/ 0 赞/ 806 阅读
还没有评论,来说两句吧...