Head First 设计模式 —— 11. 组合 (Composite) 模式
思考题
我们不仅仅要支持多个菜单,升值还要支持菜单中的菜单。你如何处理这个新的设计需求? P355
- 【提示】在我们的新设计中,真正需要以下三点:
P354
- 我们需要某种属性结构,可以容纳菜单、子菜单和菜单项
- 我们需要确定能够在每个菜单的各个项之间游走,而且至少要像现在用迭代器一样方便
- 我们也需要能够更有弹性地在菜单项之间游走。比方说,可能只需要遍历甜点菜单,或者可以遍历餐厅的整个菜单(包括甜点菜单在内)
- 提供一个接口,统一菜单和菜单项的超类
- 接口包含菜单和菜单项的共同方法,菜单中执行方法是依次执行每个子项中的相同方法
- 接口包含菜单特有的增删改查子项的方法,菜单项中的增删改查子项的方法实现为直接抛出
UnsupportedOperationException
- 可以通过
instanceof
判断当前项是菜单还是菜单项
组合模式
允许你将对象组合成树形结构来表现”整体/部分“层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
特点
- 把相同的操作应用在组合和个别对象上,即可以忽略对象组合和个别对象之间的差别
P357
- 以违反单一职责设计原则换取透明性,即不但要管理层次结构,还要同时包含管理组合和叶节点的操作,以将组合和叶节点一视同仁
P367
空迭代器:空对象(命令模式中提到过)的一个例子。空迭代器, hasNext()
永远返回 false
, next()
永远返回 null
(个人觉得可以抛出 NoSuchElementException
), remove()
永远抛出 UnsupportedOperationException
。 P372
思考题
public class Waitress {
MenuComponent allMenus;
public Waitress(MenuComponent allMenus) {
this.allMenus = allMenus;
}
public void printMenu() {
allMenus.print();
}
public void printVegetarianMenu() {
Iterator iterator = allMenus.createIterator();
System.out.println("\nVEGETARIAN MENU\n----");
while (iterator.hasNext()) {
MenuComponent menuComponent = (MenuComponent)iterator.next();
try {
if (menuComponent.isVegetarian()) {
menuComponent.print();
}
} catch (UnsupportedOperationException e) {}
}
}
}
printVegetarianMenu()
方法中只有菜单项的 print()
方法可以被调用,绝对不能调用菜单(组合)的 print()
方法。你能说出原因吗? P373
- 使用迭代器遍历时已经会遍历所有的节点(包括组合节点和叶节点),而组合节点会打印所有子节点信息,如果调用组合节点的
print()
,则必定会重复打印某些叶节点。
思考题
配对下列模式和描述: P379
策略模式:封装可互换的行为,并使用委托决定使用哪一个
适配器模式:改变一个或多个类的接口
迭代器模式:提供一个方式来遍历集合,而无须暴露集合的实现
外观模式:简化一群类的接口
组合模式:客户可以将对象的集合以及个别的对象一视同仁
观察者模式:当某个状态改变时,允许一群对象能被通知到
所思所想
- 以前在很多地方其实都用到了这种思想,二叉树、trie 树和线段树等树结构都允许将节点组成树形结构来表现”整体/部分“的层次结构,并且提供了一致的方式处理非叶节点和叶节点(非叶节点的方法内部按照特定逻辑处理和调用子节点的相同方法)
本文首发于公众号:满赋诸机(点击查看原文) 开源在 GitHub :reading-notes/head-first-design-patterns
Head First 设计模式 —— 11. 组合 (Composite) 模式的更多相关文章
- 设计模式C++描述----11.组合(Composite)模式
一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: / ...
- C++设计模式实现--组合(Composite)模式
一. 举例 这个样例是书上的,如果有一个公司的组结结构例如以下: 它的结构非常像一棵树,当中人力资源部和財务部是没有子结点的,详细公司才有子结点. 并且最关健的是,它的每一层结构非常相似. 代码实现例 ...
- Java 实现组合(Composite)模式
类图 /** * 树 总体 * * @author stone * */ public class Tree { private TreeNode root; //根节点 public Tree(St ...
- 组合(composite)模式
定义 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性 组合模式(Composite)将小对象组合成树形结构,使用户操作组合对象如同操作一个单个对象.组 ...
- 八、结构模式之组合(Composite)模式
组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系.其可以使客户端将单纯元素和组合元素同等对待. 当需求中是体现部分与整体层次的结构时,以 ...
- 设计模式-11享元模式(Flyweight Pattern)
1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...
- java设计模式-----11、代理模式
Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问. 所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代 ...
- Java设计模式之 — 组合(Composite)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153753 听说你们公司最近新推出了一款电子书阅读应用,市场反应很不错,应用里还有 ...
- Java设计模式11:外观模式
外观模式 外观模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的外观对象进行.外观模式是一个高层次的接口,使得子系统更易于使用. 医院的例子 现代的软件系统都是比较复杂的.假如把医院比作一 ...
随机推荐
- 密码学系列之:明文攻击和Bletchley Park
目录 简介 crib和明文攻击 布莱奇利公园(Bletchley Park) 简介 明文攻击就是指已经知道了部分明文和它对应的加密后的字段,从而可以推测出使用的加密手段或者密码本.明文攻击这个故事还要 ...
- STL—— 容器(vector)数据插入insert()方法 的返回值
vector 容器下的 insert() 方法拥有返回值,由于insert() 方法拥有4种重载函数,他的返回值不尽相同. 第一种,插入单个元素后的返回值: 1 #include <iostre ...
- JavaSE15-集合·其二
1.Set集合 1.1 Set集合概述和特点 Set集合的特点 元素存取无序 没有索引.只能通过迭代器或增强for循环遍历 不能存储重复元素 1.2 哈希值 哈希值简介 是JDK根据对象的地址或者字符 ...
- 测开之数据类型· 第3篇《列表推导式、字典推导式、2种方式创建生成器》
坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.列表推导式 二.字典推导式 三.2种方式创建生成器 1.生成器表达式 2.函数里面,通过 y ...
- Java 一行代码 数组遍历输出
Arrays.stream(arr).forEach(num -> System.out.println(num));
- Eureka系列(三)获取服务Client端具体实现
获取服务Client 端流程 我们先看下面这张图片,这张图片简单描述了下我们Client是如何获取到Server已续约实例信息的流程: 从图片中我们可以知晓大致流程就是Client会自己开启一个 ...
- Python高级语法-私有化-私有化理解(4.3.1)
@ 目录 1.说明 2.代码 关于作者 1.说明 __a(私有):只能在类的内部使用,对象使用,但是子类不允许使用,不能导入到其他包 a(protected):可以在子类使用,可以通过对象访问,不能导 ...
- AWVS批量导入网站(刷漏洞入门)
今天整了一天这个AWVS批量扫描脚本,主要是下了好几个版本的AWVS,都不稳定,一次次删除又一次次安装. 做这件事儿目的就是为了批量刷漏洞,不过弄好之后又不打算刷漏洞了,不太喜欢无脑刷漏洞,没什么意义 ...
- 30道 有趣的 的 JVM 面试题
目录 1.JVN内存结构 2.对象分配规则 3.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法 4.Perm Space中保存什么数据?会引起OutOfMemor ...
- 【python爬虫】一个简单的爬取百家号文章的小爬虫
需求 用"老龄智能"在百度百家号中搜索文章,爬取文章内容和相关信息. 观察网页 红色框框的地方可以选择资讯来源,我这里选择的是百家号,因为百家号聚合了来自多个平台的新闻报道.首先看 ...