适配器模式

 一、定义

适配器模式,即定义一个包装类,用于包装不兼容接口的对象。

包装类=适配器

被包装的类=被适配的类

二、解决的问题

原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

三、模式原理

3.1 类适配器模式

类的适配器模式是把适配的类的API转换成为目标类的API。

在上图中可以看出:

冲突:Target期待调用Request方法,而Adaptee并没有(这就是所谓的不兼容了)。
解决方案:为使Target能够使用Adaptee类里的SpecificRequest方法,故提供一个中间环节Adapter类(继承Adaptee & 实现Target接口),把Adaptee的API与Target的API衔接起来(适配)。

3.2 举个例子:

步骤1、首先创建Target接口

public interface Target {

    //这是源类Adapteee没有的方法
    public void Request(); 
}

步骤2、接着创建源类

1 public class Adaptee {
2 
3     public void SpecificRequest(){
4     }
5 }

步骤3、创建适配器

 1 //适配器Adapter继承自Adaptee,同时又实现了目标(Target)接口。
 2 public class Adapter extends Adaptee implements Target {
 3 
 4     //目标接口要求调用Request()这个方法名,但源类Adaptee没有方法Request()
 5     //因此适配器补充上这个方法名
 6     //但实际上Request()只是调用源类Adaptee的SpecificRequest()方法的内容
 7     //所以适配器只是将SpecificRequest()方法作了一层封装,封装成Target可以调用的Request()而已
 8     @Override
 9     public void Request() {
10         this.SpecificRequest();
11     }
12 
13 }

步骤5、使用具体的目标类

1 public class AdapterPattern {
2 
3     public static void main(String[] args){
4 
5         Target mAdapter = new Adapter();
6         mAdapter.Request();
7 
8     }
9 }

3.2 对象的适配器模式

在上图中可以看出:


冲突:Target期待调用Request方法,而Adaptee并没有(这就是所谓的不兼容了)。
解决方案:为使Target能够使用Adaptee类里的SpecificRequest方法,故提供一个中间环节Adapter类(包装了一个Adaptee的实例),把Adaptee的API与Target的API衔接起来(适配)。

步骤1、创建Target接口

1 public interface Target {
2 
3     //这是源类Adapteee没有的方法
4     public void Request(); 
5 }

步骤2、创建源类

1 public class Adaptee {
2 
3     public void SpecificRequest(){
4     }
5 }

步骤3、创建适配器类

 1 class Adapter implements Target{  
 2     // 直接关联被适配类  
 3     private Adaptee adaptee;  
 4 
 5     // 可以通过构造函数传入具体需要适配的被适配类对象  
 6     public Adapter (Adaptee adaptee) {  
 7         this.adaptee = adaptee;  
 8     }  
 9 
10     @Override
11     public void Request() {  
12         // 这里是使用委托的方式完成特殊功能  
13         this.adaptee.SpecificRequest();  
14     }  
15 }  

步骤四、具体使用目标类

1 public class AdapterPattern {
2     public static void main(String[] args){
3         //需要先创建一个被适配类的对象作为参数  
4         Target mAdapter = new Adapter(new Adaptee());
5         mAdapter.Request();
6 
7     }
8 }

四、适用的场景

  • 系统需要复用现有类,而该类的接口不符合系统的需求,可以使用适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
  • 多个组件功能类似,但接口不统一且可能会经常切换时,可使用适配器模式,使得客户端可以以统一的接口使用它们

参考:

https://blog.csdn.net/carson_ho/article/details/54910430

原文地址:https://www.cnblogs.com/wylwyl/p/10496363.html