第 7 章 适配器模式与外观模式
7.1 适配器模式
1. 模式定义
将一个类的接口,转换为客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。
2. 模式类图
有两种适配器模式的实现,一种是对象方式,一种是类方式。对象方式是通过组合的方法,让适配器类(Adapter)拥有一个待适配的对象(Adaptee),从而把相应的处理委托给待适配的对象。类方式用到多重继承,Adapter 可以看成 Target 和 Adaptee 类型,先把它当成 Adaptee 类型然后实例化一个 Adapter 对象,再把它当成 Target 类型的,这样 Client 就可以把这个对象当成 Target 的对象来处理。
3. 问题描述
让鸭子(Duck)适配火鸡(Turkey),Duck 有 quack() 方法,而 Turkey 只有 gobble() 方法。也就是要让 Turkey 也有 Duck 的 quack() 方法。
简单理解: 火鸡只能调用火鸡方法,,现在鸭子直接调用火鸡的方法可能吗?不可以,所以做个适配器类,这个类里进行调用就可以了
好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你。这一原则可以防止依赖腐败,即防止高层组件依赖底层组件,底层组件又依赖高层组件。该原则在模板方法的体现为,只有父类会调用子类,子类不会调用父类。
6. 钩子
钩子(hock):某些步骤在不同实现中可有可无,可以先定义一个什么都不做的方法,把它加到模板方法 templteMethod() 中,如果子类需要它就覆盖默认实现并加上自己的实现。
个人理解:写个抽象的类,一些抽象方法,让子类去重写。
7. 代码实现
public abstract class CaffeineBeverage { final void prepareRecipe(){ boilWater(); brew(); pourInCup(); addCondiments(); } abstract void brew(); abstract void addCondiments(); void boilWater(){ System.out.println("boilWater"); } void pourInCup(){ System.out.println("pourInCup"); } }
public class Coffee extends CaffeineBeverage{ @Override void brew() { System.out.println("Coffee.brew"); } @Override void addCondiments() { System.out.println("Coffee.addCondiments"); } }
public class Tea extends CaffeineBeverage{ @Override void brew() { System.out.println("Tea.brew"); } @Override void addCondiments() { System.out.println("Tea.addCondiments"); } }
public class CaffeineBeverageTestDrive { public static void main(String[] args) { CaffeineBeverage caffeineBeverage = new Coffee(); caffeineBeverage.prepareRecipe(); System.out.println("-----------"); caffeineBeverage = new Tea(); caffeineBeverage.prepareRecipe(); } }
运行结果
boilWater Coffee.brew pourInCup Coffee.addCondiments
第 9 章 迭代器和组合模式
9.1 迭代器模式
1. 模式定义
提供一种顺序访问一个聚合对象中的各个元素的方法,而又不暴露其内部的表示。
2. 模式类图
客户类拥有一个聚合对象和迭代器对象,迭代器对象是聚合对象生成的。只需要迭代器定义好移动的操作,就可以让聚合对象能够顺序遍历。
3. 代码实现
public class Aggregate { private int[] items; public Aggregate() { items = new int[10]; for (int i = 0; i < items.length; i++) { items[i] = i; } } public Iterator createIterator() { return new ConcreteIterator(items); } }
public interface Iterator { boolean hasNext(); int next(); }
public class ConcreteIterator implements Iterator { private int[] items; private int position = 0; public ConcreteIterator(int[] items) { this.items = items; } @Override public boolean hasNext() { return position < items.length; } @Override public int next() { return items[position++]; } }
public class Client { public static void main(String[] args) { Aggregate aggregate = new Aggregate(); Iterator iterator = aggregate.createIterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } }
运行结果
0 1 2 3 4 5 6 7 8 9