组合模式

组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合。
组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口。这就是组合模式能够将组合对象和简单对象进行一致处理的原因。

组合部件(Component):它是一个抽象角色,为要组合的对象提供统一的接口。
叶子(Leaf):在组合中表示子节点对象,叶子节点不能有子节点。
合成部件(Composite):定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)和删除(Remove)。


案例:商品关系
源代码:安全模式

package org.zangyu.Composite;import java.util.ArrayList;
import java.util.Collection;public class Composite {public static void main(String[] args) {// TODO Auto-generated method stub//定义所有的组合对象Composite1 root=new Composite1("服装");Composite1 c1=new Composite1("男装");Composite1 c2=new Composite1("女装");//定义所有叶子节点Leaf l1=new Leaf("衬衣");Leaf l2=new Leaf("夹克");Leaf l3=new Leaf("裙子");Leaf l4=new Leaf("套装");//按照树的结构来组合组合对象和叶子对象root.addComposite(c1);root.addComposite(c2);c1.addLeaf(l1);c1.addLeaf(l2);c2.addLeaf(l3);c2.addLeaf(l4);root.printStruct(0);}}
class Leaf{//叶子节点private String name="";public Leaf(String name) {this.name=name;}public void printStruct(int d) {for(int i=0;i<d;i++) {System.out.print(" ");}System.out.println("-"+name);}
}
class Composite1{//容器节点private Collection<Composite1> childcomposite =new ArrayList<Composite1>();private Collection<Leaf>childleaf =new ArrayList<Leaf>();private String name="";public Composite1(String name) {super();this.name = name;}public void addComposite(Composite1 c) {this.childcomposite.add(c);}public void addLeaf(Leaf leaf) {this.childleaf.add(leaf);}public void printStruct(int d) {for(int i=0;i<d;i++) {System.out.print(" ");}System.out.println("+"+name);for(Leaf leaf:childleaf) {leaf.printStruct(d+2);}for(Composite1 c:childcomposite) {c.printStruct(d+2);}}
}

在容器和客户端内区分组合对象和叶子对象并区别对待,程序复杂对功能扩展也带来不便。
改进:抽象出来共同基类继承它产生叶子节点和容器节点。


源代码:透明模式

package org.zangyu.Composite;import java.util.ArrayList;
import java.util.Collection;public class Composite2 {public static void main(String[] args) {// TODO Auto-generated method stub//定义所有的组合对象Composite1 root=new Composite1("服装");Composite1 c1=new Composite1("男装");Composite1 c2=new Composite1("女装");//定义所有叶子节点Leaf l1=new Leaf("衬衣");Leaf l2=new Leaf("夹克");Leaf l3=new Leaf("裙子");Leaf l4=new Leaf("套装");//按照树的结构来组合组合对象和叶子对象root.Add(c1);root.Add(c2);c1.Add(l1);c1.Add(l2);c2.Add(l3);c2.Add(l4);root.printStruct(0);}}
abstract class Component{protected String name;public Component(String name) {super();this.name = name;}public abstract void Add(Component component);public abstract void Remove(Component component);public abstract void printStruct(int component);
}
class Leaf extends Component{//叶子节点public Leaf(String name) {super(name);}public void printStruct(int d) {for(int i=0;i<d;i++) {System.out.print(" ");}System.out.println("-"+name);}@Overridepublic void Add(Component component) {// TODO Auto-generated method stubSystem.out.println("不能添加分支");}@Overridepublic void Remove(Component component) {// TODO Auto-generated method stubSystem.out.println("不能删除分支");}
}
class Composite1 extends Component{//容器节点private Collection<Component> components =new ArrayList<Component>();public Composite1(String name) {super(name);}public void printStruct(int d) {for(int i=0;i<d;i++) {System.out.print(" ");}System.out.println("+"+name);for(Component s:components) {s.printStruct(d+2);}}@Overridepublic void Add(Component component) {// TODO Auto-generated method stubcomponents.add(component);}@Overridepublic void Remove(Component component) {// TODO Auto-generated method stubcomponents.remove(component);}
}

组合模式框架
源代码:透明方式

package org.zangyu.Composite;import java.util.ArrayList;
import java.util.Collection;public class Composite3 {public static void main(String[] args) {// TODO Auto-generated method stub//定义所有的组合对象Composite1 root=new Composite1("root");//树根,长出两个树叶LeafA和LeafBroot.Add(new Leaf("LeafA"));root.Add(new Leaf("LeafB"));//树根长出分支rootx,并有LeafAX和LeafBXComposite1 rootx=new Composite1("rootx");rootx.Add(new Leaf("LeafAX"));rootx.Add(new Leaf("LeafBX"));root.Add(rootx);//分支rootx长出分支rootxy,并有LeafAXY和LeafBXYComposite1 rootxy=new Composite1("rootxy");rootxy.Add(new Leaf("LeafAXY"));rootxy.Add(new Leaf("LeafBXY"));rootx.Add(rootxy);//树根,长出树叶LeafCroot.Add(new Leaf("LeafC"));root.printStruct(0);}}
abstract class Component{protected String name;public Component(String name) {super();this.name = name;}//增加删除树叶或树枝public abstract void Add(Component component);public abstract void Remove(Component component);public abstract void printStruct(int component);
}
class Leaf extends Component{//叶子节点public Leaf(String name) {super(name);}public void printStruct(int d) {for(int i=0;i<d;i++) {System.out.print(" ");}System.out.println("-"+name);}@Overridepublic void Add(Component component) {// TODO Auto-generated method stubSystem.out.println("不能添加分支");}@Overridepublic void Remove(Component component) {// TODO Auto-generated method stubSystem.out.println("不能删除分支");}
}
class Composite1 extends Component{//容器节点private Collection<Component> components =new ArrayList<Component>();public Composite1(String name) {super(name);}public void printStruct(int d) {//输出格式,缩进for(int i=0;i<d;i++) {System.out.print(" ");}System.out.println("+"+name);for(Component s:components) {s.printStruct(d+2);}}@Overridepublic void Add(Component component) {// TODO Auto-generated method stubcomponents.add(component);}@Overridepublic void Remove(Component component) {// TODO Auto-generated method stubcomponents.remove(component);}
}

1、组合模式的使用场景

当想表达对象的部分-整体的层次结构时。希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时。2、优缺点

缺点:客户端需要花更多时间理清类之间的层次关系

优点:无需关系处理的单个对象,还是组合的对象容器,实现容器之间的解耦合。当有新部件时容易添加进来。

设计模式 —— 组合模式相关推荐

  1. 设计模式---组合模式

    设计模式---组合模式 什么是组合模式:Composite? 使用场景 代码示例 组合模式模板 组合模式的安全性和透明性 总结 优缺点: 适用场景: 什么是组合模式:Composite? 计算机的文件 ...

  2. Java设计模式 —— 组合模式(Composite)

    Java设计模式 -- 组合模式(Composite) 定义 Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性. ...

  3. JS设计模式--组合模式

    JS设计模式–组合模式 昨天学习了白贺翔老师的JS组合模式,现在把我学到的分享出来叭O(∩_∩)O,直接看下面代码 <!DOCTYPE html> <html lang=" ...

  4. 设计模式----组合模式UML和实现代码

    2019独角兽企业重金招聘Python工程师标准>>> 一.什么是组合模式? 组合模式(Composite)定义:将对象组合成树形结构以表示'部分---整体'的层次结构.组合模式使得 ...

  5. 大话设计模式—组合模式

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  6. java设计模式 组合_JAVA 设计模式 组合模式

    用途组合模式 (Component) 将对象组合成树形结构以表示"部分-整体"的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模式. 结构 ...

  7. Java常用设计模式————组合模式

    引言 组合模式,是一种类似递归算法的结构性设计模式,通过以简单的 List ,组合本类对象,实现树状对象结构的"部分.整体"的层次. 它可以让调用程序不需要关心复杂对象与简单对象的 ...

  8. C++设计模式-组合模式

    目录 基本概念 代码与实例 基本概念 个人感觉Qt的对象树就是运用了这种设计模式!!! 当然,只是个人感觉,本人并没有研究Qt的源码 组合模式(Composite):将对象组合成树形结构以表示'部分- ...

  9. [Head First设计模式]生活中学设计模式——组合模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  10. 简说设计模式——组合模式

    一.什么是组合模式 前面我们讲过Swing(Java进阶篇(六)--Swing程序设计(上)),在Swing中,容器Container和组件如Button.JLabel等等之间的关系就是组合关系,一个 ...

最新文章

  1. UC伯克利新机器人成果:灵活自由地使用工具
  2. Python读取保存在hdf5文件中的脑电数据
  3. html调试模式查看data数据库,接口调试:在线sql语句查看与性能优化
  4. 微信小程序 request请求数据 模块输出
  5. linux svn 常用命令
  6. 算法入门篇三 详解桶排序和整理排序知识 堆的相关操作 补充 不完整
  7. Git 少用 Pull 多用 Fetch 和 Merge
  8. CSS 让数字滑动显示
  9. webservice 心得
  10. 《数字图像处理》笔记
  11. 数据仓库系列之元数据管理
  12. 海康威视错误代码0xf_海康威视视频智能分析整理文档
  13. 教你如何使用 Python 将 pdf 文档进行 加密 解密——python实用小技能分享
  14. Elasticsearch概念
  15. 使用breakpad收集native奔溃日志及dump解析
  16. Android系统触摸屏移植后出现小圆圈
  17. 向来回首萧瑟处,也无风雨也无晴
  18. CREStereo: Practical Stereo Matching via Cascaded Recurrent Networkwith Adaptive Correlation-论文阅读
  19. 伪静态 真伪静态的区别
  20. JS中的分支语句和循环语句

热门文章

  1. 复刻顶刊实证论文!思路梳理+全数据源+python代码
  2. 【C语言精讲】——创建数组、使用数组(一维数组、二维数组)
  3. iot-Scada免费Scada组态软件系列教程2-架构设计
  4. 异步调用Web服务方法
  5. 猿创征文|Java计算【生日工具类】看这篇就够了
  6. filebeat收集日志+ELK架构、ELK监控
  7. 核磁共振仪——高场和低场核磁比较
  8. 淘宝/天猫接口地址整理
  9. 微信小程序学习笔记,知识点全面概括总结
  10. OSChina 周四乱弹 ——乱弹倒计时二篇