思考题
public void printMenu() { PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu(); ArrayList breakfastItems = pancakeHouseMenu.getMenuItems(); DinerMenu dinerMenu = new DinerMenu(); MenuItem[] lunchItems = dinerMenu.getMenuItems(); for (int i = 0; i < breakfastItems.size(); ++i) { MenuItem menuItem = (MenuItem) breakfastItems.get(i); System.out.print(menuItem.getName() + " "); System.out.println(menuItem.getPrice() + " "); System.out.println(menuItem.getDescription()); } for (int i = 0; i < lunchItems.length; ++i) { MenuItem menuItem = lunchItems[i]; System.out.print(menuItem.getName() + " "); System.out.println(menuItem.getPrice() + " "); System.out.println(menuItem.getDescription()); }}
依据咱们的 printMenu()
实现,下列哪一项为真? P322
[x] A. 咱们是针对
PancakeHouseMenu
和DinerMenu
的具体实现编码,而不是针对接口。- 针对具体实现编程,没有解耦,无奈动静替换
[ ] B. 女招待没有实现 Java 款待 API ,所以她没有恪守规范。
- 女招待有一个款待规格,算是实现了一个隐式 API,并且外部实现封装了变动
[x] C. 如果咱们决定从
DinerMenu
切换到另一种菜单,此菜单的项是用Hashtable
来寄存的,咱们会因而须要批改女招待中的许多代码。Hashtable
是一种新的具体实现,须要批改代码进行适配
[x] D. 女招待须要晓得每个菜单如何表白外部的菜单项汇合,这违反了封装。
- 女招待的实现依赖菜单外部实现,与菜单强耦合,没有封装变动
[x] E. 咱们有反复的代码;
printMenu()
办法须要两个循环,来遍历两种不同的菜单。如果咱们加上第三种菜单,咱们就须要第三个循环。- 因为是针对菜单项汇合的具体实现编程,所以减少新菜单就须要减少循环
[ ] F. 这个实现并没有基于 MXML(Menu XML),所以就没有方法互操作。
The implementation isn't based on MXML(Menu XML) and so isn't as interoperable as it shoule be.
- 互操作性(英文:Interoperability;中文又称为:协同工作能力,互用性)作为一种个性,它指的是不同的零碎和组织机构之间相互合作,协同工作(即互操作)的能力。就软件而言,互操作性——这条术语用来形容的是不同的程序(programs)借助于同一套替换格局(exchange formats)来替换数据,读写雷同文件格式(file formats)以及采纳雷同协定(protocols)的能力。
- 刚开始不懂,看了维基百科后的解释后有点似懂非懂。这个实现外部间接解决了不同数据格式,具备肯定的互操作性。
思考题
请持续实现 PancakeHouseIterator
的实现,并对 PancakeHouseMenu
类做出必要的批改。 P327
public class PancakeHouseIterator implements Iterator { ArrayList items; int position = 0; public PancakeHouseIterator(ArrayList items) { this.items = items; } public Object next() { return items.get(position++); } public boolean hasNext() { return position >= items.size(); }}public class PancakeHouseMenu { ArrayList menuItems; // 结构器和其余办法 // 移除 public ArrayList getMenuItems() 办法 public Iterator createIterator() { return new PancakeHouseIterator(menuItems); }}
迭代器模式
提供一种办法程序拜访一个聚合对象中的各个元素,而又不裸露其外部的示意。 P336
特点
- 遍历汇合外部元素而不裸露外部示意
P336
- 让聚合的接口和实现变得简洁
P336
- 治理对象汇合,不用理睬遍历的事件
P336
思考题
迭代器模式的类图看起来很像咱们所学过的另一个模式;你晓得是哪个模式吗?提醒:子类决定要创立哪个对象。 P337
- 工厂办法模式
设计准则
繁多职责准则:一个类应该只有一个引起变动的起因 P339
- 高内聚:一个模块或一个类只反对一组相干的性能
P339
特点
- 尽量将一个责任只指派给一个类
P339
- 遵循繁多职责准则的类是高内聚的
P339
思考题
请很快写下为了能让咖啡厅的菜单代码合乎咱们的框架,咱们要对它做的三件事件: P342
public class CafeMenu { HashTable menuItems = new Hashtable(); public CafeMenu() { // 省略下述参数 // addItem(...); // addItem(...); // addItem(...); } public void addItem(String name, String description, boolean vegetarian, double price) { MenuItem menuItem = new MenuItem(name, description, vegetarian, price); menuItems.put(menuItem.getName(), menuItem); } public Hashtable getItems() { return menuItems; }}
- 实现
Menu
接口 - 删除
getItems()
办法 - 减少
createIterator()
办法
本文首发于公众号:满赋诸机(点击查看原文) 开源在 GitHub :reading-notes/head-first-design-patterns