设计模式学习专栏六--------适配器模式
场景
如何让火鸡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 gobbleI'm flying a short distanceThe Duck says...QuackI'm flyingThe TurkeyAdapter says...Gobble gobbleI'm flying a short distanceI'm flying a short distanceI'm flying a short distanceI'm flying a short distanceI'm flying a short distance复制代码
客户使用适配器的过程
- 客户通过目标接口调用适配器的方法对适配器发出请求
- 适配器使用 被适配者接口 把 请求转换成 被适配者的一个或多个调用接口
- 客户接收到 调用的结果,但并未察觉这一切是适配器在起转换作用
客户和被适配者是解耦的, 它们互相不知道对方的存在
适配器模式总览
定义:将一个类的接口,
转换成
客户期望的另一个接口,适配器让原本不兼容的类可以合作无间
- 类图
-
模式的理解
-
角色
- 目标接口
- 被适配者
- 适配器
-
两种适配器的存在
-
类适配器
-
类图
-
-
对象适配器
-
两者的比较
- 对象适配器使用
组合
来适配被适配者 , 类适配器使用继承
来适配被适配者 - 类适配器 有 多重继承的问题
- 对象适配器能够 切换不同的被适配者 , 在运行中也可以.而类适配器只能采用特定的被适配类
- 对象适配器使用
-
-
-
真实世界的迭代器
-
枚举(Enumeration)和迭代器(Iterator)
-
类图设计 : 在面对遗留代码中 , 如何让迭代器 代替 枚举器接口?
-
适配器代码
public class EnumerationIterator implements Iterator
-
-
参考
书籍: HeadFirst设计模式
代码参考地址: