设计模式学习专栏六--------适配器模式
场景
如何让火鸡Turckey冒充鸭子Duck
鸭子接口
public interface Duck {
public void quack();
public void fly();
}
鸭子的实现类--绿头鸭
public class MallardDuck implements Duck {
public void quack() {
System.out.println("Quack");
}
public void fly() {
System.out.println("I'm flying");
}
}
火鸡接口
public interface Turkey {
public void gobble();
public void fly();
}
火鸡的实现类--野生火鸡
public class WildTurkey implements Turkey {
public void gobble() {
System.out.println("Gobble gobble");
}
public void fly() {
System.out.println("I'm flying a short distance");
}
}
如何实现
现在,我们缺少鸭子对象,需要用一些火鸡来冒充鸭子,显而易见,因为火鸡的接口不同,所以不能公然拿来使用
-
创建我们的火鸡适配器
测试代码
public class DuckTestDrive { public static void main(String[] args) { MallardDuck duck = new MallardDuck(); WildTurkey turkey = new WildTurkey(); Duck turkeyAdapter = new TurkeyAdapter(turkey); System.out.println("The Turkey says..."); turkey.gobble(); turkey.fly(); System.out.println("\nThe Duck says..."); testDuck(duck); System.out.println("\nThe TurkeyAdapter says..."); testDuck(turkeyAdapter); } static void testDuck(Duck duck) { duck.quack(); duck.fly(); } }
测试结果
The Turkey says... Gobble gobble I'm flying a short distance The Duck says... Quack I'm flying The TurkeyAdapter says... Gobble gobble I'm flying a short distance I'm flying a short distance I'm flying a short distance I'm flying a short distance I'm flying a short distance
客户使用适配器的过程
- 客户通过目标接口调用适配器的方法对适配器发出请求
- 适配器使用 被适配者接口 把 请求转换成 被适配者的一个或多个调用接口
- 客户接收到 调用的结果,但并未察觉这一切是适配器在起转换作用
客户和被适配者是解耦的, 它们互相不知道对方的存在
适配器模式总览
定义:将一个类的接口,
转换成
客户期望的另一个接口,适配器让原本不兼容的类可以合作无间
- 类图
-
模式的理解
-
角色
- 目标接口
- 被适配者
- 适配器
-
两种适配器的存在
-
类适配器
-
类图
-
对象适配器
-
两者的比较
- 对象适配器使用
组合
来适配被适配者 , 类适配器使用继承
来适配被适配者 - 类适配器 有 多重继承的问题
- 对象适配器能够 切换不同的被适配者 , 在运行中也可以.而类适配器只能采用特定的被适配类
- 对象适配器使用
-
-
-
真实世界的迭代器
-
枚举(Enumeration)和迭代器(Iterator)
-
类图设计 : 在面对遗留代码中 , 如何让迭代器 代替 枚举器接口?
-
适配器代码
public class EnumerationIterator implements Iterator<Object> { Enumeration<?> enumeration; public EnumerationIterator(Enumeration<?> enumeration) { this.enumeration = enumeration; } public boolean hasNext() { return enumeration.hasMoreElements(); } public Object next() { return enumeration.nextElement(); } public void remove() { throw new UnsupportedOperationException(); } }
-
-
参考
书籍: HeadFirst设计模式
代码参考地址: 我就是那个地址