首页 > 代码库 > 适配器模式——HeadFirst设计模式学习笔记

适配器模式——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设计模式学习笔记