适配器模式——HeadFirst设计模式学习笔记
Posted HectorHou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配器模式——HeadFirst设计模式学习笔记相关的知识,希望对你有一定的参考价值。
适配器模式:将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不相融的类可以相互合作
设计:
- 实现想要转换的接口
- 取得要适配的对象的引用,作为局部变量
- 用要适配的对象的方法实现接口中的方法
客户使用适配器的过程:
- 通过目标接口调用适配器方法
- 适配器使用被适配者的接口转换成对被适配者的调用
- 客户端接受调用结果,但并未察觉适配器在中转的作用
特点:
- 将类的接口转换成想要的接口,以便实现不同的接口,符合用户的期望
- 适配器实现了目标接口,并持有被适配者的实例
- 客户与适配器是解耦的
- 可以通过实现双边的接口设计双向的适配器
- 使用对象的组合,被适配者的子类也可以搭配适配器使用
对象适配器vs类适配器:
- 对象适配器采用组合形式;类适配器采用继承形式
-
装饰者vs适配器:
- 装饰者目的是添加新的行为责任,适配器目的是转换接口
- 对客户端均透明
举例:
使用新的火鸡代替鸭子,客户希望想操作鸭子一样操作火鸡
火鸡接口与鸭子接口:
1 public interface Turkey { 2 public void gobble(); 3 public void fly(); 4 } 5 6 public interface Duck { 7 public void quack(); 8 public void fly(); 9 }
创建适配器:
1 public class TurkeyAdapter implements Duck { 2 Turkey turkey; 3 TurkeyAdapter(Turkey turkey){ 4 this.turkey = turkey; 5 } 6 public void fly() { 7 for(int i=0;i<5;i++){ 8 turkey.fly(); 9 } 10 } 11 public void quack() { 12 turkey.gobble(); 13 } 14 }
客户端通过适配器像操作鸭子一样操作火鸡,而无需知道我们是通过适配器操作,更无需知道我们操作的是哪种鸭子或火鸡,因为我们是面向接口而不是实现编程
1 public class DuckTestDrive { 2 public static void main(String[] args) { 3 MallardDuck Duck = new MallardDuck(); 4 WildTurkey turkey = new WildTurkey(); 5 Duck turkeyAdapter = new TurkeyAdapter(turkey); // generate a turkey-like duck 6 turkeyAdapter.fly(); 7 turkeyAdapter.quack(); 8 } 9 }
以上是关于适配器模式——HeadFirst设计模式学习笔记的主要内容,如果未能解决你的问题,请参考以下文章