设计模式 ——— 适配器模式

作者: tomas家的小拨浪鼓 | 来源:发表于2017-11-11 02:34 被阅读93次

    ADAPTER(适配器) ———— 类对象结构型模式

    意图

    将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。
    现在,我们知道,这个模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。这可以让客户从实现的接口解耦。如果在一段时间之后,我们想要改变接口,适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口而每次跟着修改。

    适配器模式的本质:转换匹配,复用功能。
    适配器通过转换调用已有的实现,从而能把已有的实现匹配成需要的接口,使之能满足客户端的需要。也就是说转换匹配是手段,而复用已有的功能才是目的。

    适用性

    • 如果你想要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口
    • 如果你想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这种情况可以使用适配器模式,到时候需要什么就适配什么
    • (仅适用于“对象”适配器)如果你想使用一些已经存在的子类,但是不可能对每一个子类都进行适配,这种情况可以选用对象适配器,直接适配这些子类的父类就可以了。

    结构

    “类”适配器使用多重继承对一个接口与另一个接口进行匹配


    “类”适配器结构图

    “对象”适配器依赖于对象组合


    “对象”适配器结构图
    • Target
      定义Client使用的与特定领域相关的接口。
    • Client
      与符合Target接口的对象协同
    • Adaptee
      定义一个已经存在的接口,这个接口需要适配
    • Adapter
      对Adaptee的接口与Target接口进行适配

    协作

    Client在Adapter实例上调用一些操作。接着适配器调用Adaptee的操作实现这个请求。

    适配器模式的实现

    • “对象”适配器
      这个适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者:这种做法还有额外的优点,那就是,被适配者的任何子类,都可以搭配着适配器使用。

    • “类”适配器
      “类”适配器需要多重继承才能够实现它,这在Java中是不可能的。但是当你在使用多重继承语言的时候,还是可能遇到这样的需求。

      “对象”适配器 VS “类”适配器
      “对象”适配器和“类”适配器使用两种不同的适配方式(分别是组合与继承)。“类”适配器继承了Target和Adaptee;而“对象”适配器利用组合的方式将请求传送给被适配者。

      “类”适配器:
      a) 用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,“类”适配器将不能胜任工作。
      b) 是的Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
      c) 仅仅引入了一个对象,并不需要额外的指针以间接得到adaptee。

      “对象”适配器:
      a) 允许一个Adapter与多个Adaptee ———— 即Adaptee本身以及它的所有子类(如果有子类的话)一同工作。
      b) 是的重定义Adaptee的行为比较困难。这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是Adaptee本身。

    • 智能适配器
      在实际开发中,适配器也可以实现一些Adaptee没有实现,但是在Target中定义的功能,这种情况就需要在适配器的实现里面,加入新功能的实现,这种适配器被称为智能适配器。

      如果要使用智能适配器,一般新加入的功能的实现,会用到很多Adaptee的功能,相当于利用Adaptee的功能来实现更高层的功能。当然也可以完全实现新加的功能,跟已有的功能都不靠边,变相是扩展了功能。

    • 适配多个Adaptee
      适配器在适配的时候,可以适配多个Adaptee,也就是说实现某个新的Target的功能的时候,需要调用到多个模块的功能,适配多个模块的功能才能满足新接口的要求。

    • 缺省适配
      缺省适配的意思是:为一个接口提供缺省实现。有了它,就不用直接去实现接口,而是采用继承这个缺省适配对象,从而让子类可以有选择的去覆盖实现需要的方法,对于不需要的方法,就使用缺省适配的方法就可以了。

    • 双向适配器
      适配器也可以实现双向的适配,前面我们讲的都是把Adaptee适配成为Target,其实也可以把Target适配成为Adaptee,也就是说这个适配器可以同时当作Target和Adaptee来使用。在两个不同的客户需要用不同的方式查看同一个对象时,双向适配器尤其有用。

    相关模式

    • 适配器模式 VS 装饰模式
      适配器模式与装饰模式很类似,但仅仅是类似,造成这种类似的原因:两种设计模式在实现上都是使用的对象组合,都可以在转调组合对象的功能前后进行一些附加的处理,因此有这么一个相似性。它们的目的和本质都是不一样的。一般适配器适配是需要改变接口的;而装饰模式是不改接口的,无论多少层装饰都是一个接口。
      装饰模式的本质是扩展包装的对象的行为或责任;而适配器模式本质是转换匹配,复用功能。

    参考

    《Head First 设计模式》
    《设计模式:可复用面向对象软件的基础》
    《研磨设计模式》

    相关文章

      网友评论

        本文标题:设计模式 ——— 适配器模式

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