美文网首页
适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)

作者: chenplus | 来源:发表于2019-02-18 13:51 被阅读0次

1.为什么要用适配器模式?

  • 老铁买了个超薄的杜蕾斯牌笔记本电脑(为什么薄的都叫Air? 咳咳,大声告诉我,这个单词durex怎么读? ),这个电脑啊,没有网线接口 ,到了后发现连网需要网线;现在要怎么上网呢?GG!!! 不慌,还有 USB 转 RJ45 转接线啊!那么这个线就是适配器。
  • 那么在实际开发中也存在这个问题,通常情况下,客户端可以通过目标类的接口访问它所提供的服务。有时,现有的类可以满足客户类的功能需要,但是它所提供的接口不一定是客户类所期望的,可能参数多一个无用的等,这可能是因为现有类中方法名与目标类中定义的方法名不一致等原因所导致的。在这种情况下,现有的接口需要转化为客户类期望的接口,这样保证了对现有类的重用。如果不进行这样的转化,客户类就不能利用现有类所提供的功能,适配器模式可以完成这样的转化。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作

2.什么是适配器模式?

  • 咦~ 文邹邹的
  • 适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

3.适配器模式包括什么?

适配器模式包含如下角色:
  • Target:目标抽象类
  • Adapter:适配器类
  • Adaptee:适配者类
  • Client:客户类

包装类 = 适配器Adapter;
被包装对象 = 适配者Adaptee = 被适配的类

4.举个栗子

下面代码UML图

期望调用Adaptee的reqeust的方法,偏偏它又没有t,但是修改又存在问题,所以搞了一个适配器Adapter间接的调用了Adaptee的specialReques

image.png
//目标接口
interface Target{
    //target期望调用request方法
    public void request();

}
//适配者类
class Adaptee{

    public void specialRequest(){
        //TODO
        System.out.println("specialRequest invoke...");
    }

}

//适配器类
class Adatpter extends Adaptee implements Target{

    //目标接口要求调用Request()这个方法名,但源类Adaptee没有方法Request()
    //因此适配器补充上这个方法名
    //但实际上Request()只是调用源类Adaptee的SpecificRequest()方法的内容
    //所以适配器只是将SpecificRequest()方法作了一层封装,封装成Target可以调用的Request()而已
    public void request(){
        System.out.println("request invoke....");
        this.specialRequest();
    }
}

//客户类
public class AdatperMain{

    public static void main(String[] args) {
        Target adapter = new Adatpter();
        adapter.request();
    }

}

4. 分析

优点
  1. 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。
  2. 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。
  3. 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。
缺点

对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。

使用情况
  1. 系统需要使用现有的类,而这些类的接口不符合系统的需要。
  2. 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

相关文章

网友评论

      本文标题:适配器模式(Adapter Pattern)

      本文链接:https://www.haomeiwen.com/subject/dksejqtx.html