1. 应用场景介绍

树:叶子

public class Leaf {//叶子对象的名字 private String name = ""; public Leaf(String name){this.name = name;}
}public class Composite {//用来记录包含的其它组合对象 private Collection<Composite> childComposite = new ArrayList<Composite>(); private Collection<Leaf> childLeaf = new ArrayList<Leaf>();private String name = ""; public Composite(String name){this.name = name;} public void addComposite(Composite c){this.childComposite.add(c);} public void addLeaf(Leaf leaf){this.childLeaf.add(leaf);}// 输出组合对象自身的结构 public void printStruct(String preStr){//先把自己输出去System.out.println(preStr+"+"+this.name);//然后添加一个空格,表示向后缩进一个空格,输出自己包含的叶子对象preStr+=" ";for(Leaf leaf : childLeaf){leaf.printStruct(preStr);}//输出当前对象的子对象了for(Composite c : childComposite){//递归输出每个子对象c.printStruct(preStr);}}
}public static void main(String[] args) {//定义所有的组合对象Composite root = new Composite("服装");Composite c1 = new Composite("男装");Composite c2 = new Composite("女装");//定义所有的叶子对象Leaf leaf1 = new Leaf("衬衣");Leaf leaf2 = new Leaf("夹克");Leaf leaf3 = new Leaf("裙子");Leaf leaf4 = new Leaf("套装");//按照树的结构来组合组合对象和叶子对象root.addComposite(c1);root.addComposite(c2);c1.addLeaf(leaf1);c1.addLeaf(leaf2);c2.addLeaf(leaf3);c2.addLeaf(leaf4);//调用根对象的输出功能来输出整棵树root.printStruct("");}

2. 应用组合模式

public abstract class Component {//示意方法,子组件对象可能有的功能方法 public abstract void someOperation();public void addChild(Component child) {// 缺省的实现,抛出例外,因为叶子对象没有这个功能,或者子组件没有实现这个功能throw new UnsupportedOperationException("对象不支持这个功能");} public void removeChild(Component child) {// 缺省的实现,抛出例外,因为叶子对象没有这个功能,或者子组件没有实现这个功能throw new UnsupportedOperationException("对象不支持这个功能");} public Component getChildren(int index) {// 缺省的实现,抛出例外,因为叶子对象没有这个功能,或者子组件没有实现这个功能throw new UnsupportedOperationException("对象不支持这个功能");}
}public class Leaf extends Component { public void someOperation() {// do something}
}public class Composite extends Component {//用来存储组合对象中包含的子组件对象 private List<Component> childComponents = null;public void someOperation() {      if (childComponents != null){for(Component c : childComponents){//递归的进行子组件相应方法的调用c.someOperation();}}}public void addChild(Component child) {//延迟初始化if (childComponents == null) {childComponents = new ArrayList<Component>();}childComponents.add(child);}public void removeChild(Component child) {if (childComponents != null) {childComponents.remove(child);}}public Component getChildren(int index) {if (childComponents != null){if(index>=0 && index<childComponents.size()){return childComponents.get(index);}}return null;}
}public static void main(String[] args) {//定义多个Composite对象Component root = new Composite();Component c1 = new Composite();Component c2 = new Composite();//定义多个叶子对象Component leaf1 = new Leaf();Component leaf2 = new Leaf();Component leaf3 = new Leaf();//组和成为树形的对象结构root.addChild(c1);root.addChild(c2);root.addChild(leaf1);c1.addChild(leaf2);c2.addChild(leaf3);//操作Component对象Component o = root.getChildren(1);System.out.println(o);}

《研磨设计模式》chap15 组合模式(1)简介相关推荐

  1. 研磨设计模式 之 组合模式(Composite) 3——跟着cc学设计系列

    15.3  模式讲解 15.3.1  认识组合模式 (1)组合模式的目的 组合模式的目的是:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作. 实现这个目标的关键之处,是设计一 ...

  2. 研磨设计模式 之 组合模式(Composite) 2——跟着cc学设计系列

    15.2  解决方案 15.2.1  组合模式来解决 用来解决上述问题的一个合理的解决方案就是组合模式.那么什么是组合模式呢? (1)组合模式定义 (2)应用组合模式来解决的思路 仔细分析上面不用模式 ...

  3. 研磨设计模式之 策略模式--转

    http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式   2010-09-09 作者:云飞龙行 来源:云飞龙行的blog   先感谢众多朋友的支持 ...

  4. 每天一个设计模式之组合模式

    作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...

  5. 1、【设计模式】组合模式

    java设计模式之组合模式 [学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式 ...

  6. 详解设计模式:组合模式

    组合模式(Composite Pattern),又叫部分整体模式,是 GoF 的 23 种设计模式中的一种结构型设计模式. 组合模式 是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组 ...

  7. 结构型设计模式之组合模式

    结构型设计模式之组合模式 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创 ...

  8. java设计模式之组合模式(树形层级)

    java设计模式之组合模式 学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来 ...

  9. Java设计模式之组合模式详解

    文章目录 详解Java设计模式之组合模式 案例引入 组合模式 定义 模式类图结构 相关角色 典型代码 案例分析 类图设计 实例代码 结果分析 JavaJDK中的组合模式 透明组合模式 安全组合模式 组 ...

最新文章

  1. 第三部分:Android 应用程序接口指南---第一节:应用程序组件---第七章 App Widgets...
  2. php中change方法的使用,jQuery.change()函数的使用详解
  3. 使用powershell一次性创建用户,OU及组
  4. Java后端返回通用接口设计
  5. 自然语言处理一大步,应用Word2Vec模型学习单词向量表征
  6. 求数字序列中的第n位对应的数字
  7. 条件复杂的sql语句查询
  8. Spring: @Import @ImportResource引入资源
  9. activity 和service通信,调用service方法
  10. 硬件设计1---什么是硬件工程师?
  11. w7系统计算机更改用户名,Win7怎么更改用户名
  12. 电路方案分析(十三)采用 CAN 的汽车分立式 SBC 预升压、后降压参考设计方案
  13. 超简单微信登录(微信SDK接入、友盟SDK接入)
  14. python讲师陈越_浙大陈越老师数据结构课件
  15. ndt_matching解读
  16. <C++>类的对象内存空间分配一点就通,this指针一学就会
  17. 如何使用MATLAB绘制ggplot风格图片(散点图及折线图)
  18. 计算机统计模式的符号,科学计算器的统计的符号有哪些?
  19. 同一个页面显示多个html界面,浏览器怎么设置在同一个界面/窗口打开多个网页...
  20. HTML 打印table分页

热门文章

  1. 【Python】青少年蓝桥杯_每日一题_9.11_买鸡
  2. 【Linux - mysql】linux下mysql报Failed to restart mysqld.service: Unit not found
  3. Android --- 夜神模拟器中没有图片怎么办?夜神模拟器中怎么导入图片?
  4. Java 洛谷 P1425 小鱼的游泳时间
  5. 输入年月日 输出该日期是星期几。javascript_快速提升拼音输入法的几个技巧 高手都会用!...
  6. DayDayUp之Job:牛客网—算法工程师—剑指offer之66道在线编程(解决思路及其代码)——41~66
  7. Py之curses:curses库的简介、使用、安装方法详细攻略
  8. MAT之ACA:利用ACA解决TSP优化最佳路径问题
  9. 在Python中使用lightgbm
  10. 拖延不是你的锅,全是基因惹的祸