zoukankan      html  css  js  c++  java
  • 【设计模式

    1、模式简介

    适配器模式解决的问题:

      让原本因为接口不兼容而不能一起工作的类可以一起工作。

    适配器模式的UML原理图如下图所示:

     

      从上图可见,客户想要用Target接口实现Adaptee接口中的方法,但这显然是不可能的。因此,我们需要定义一个适配器类Adapter,让它在Target和Adaptee之间做一个“调停者”,进而达到Target和Adaptee的适配。

    适配器模式中有三种角色:

    • 目标接口Target:用户期望使用的接口,这个类可以是接口,也可以是抽象类或具体类;
    • 需要适配的类Adaptee:当前系统中有的类;
    • 适配器Adapter:在现有接口和目标接口之间的“调停者”,作用是将现有接口转换成目标接口。

    适配器模式的优点:

    • 通过适配器模式,用户在做相似的操作时可以调用同一个接口,其内部过程对于用户是透明的,这样做更简单、更直接、更解耦;
    • 复用了现存的类,解决了现存类和复用环境要求不一致的问题;
    • 将目标接口和现有接口解耦,通过引入一个适配器类,而无需修改原有的代码。

    适配器模式的缺点:

      使用适配器模式后,如果想要改变适配对象,就需要更换适配器,而更换适配器是一个非常复杂的过程。

    适配器模式的适用场景:

    • 当系统需要使用现有的类,而现有的类不符合系统的接口的时候;
    • 当期望的功能和系统中现有的某个类的功能相似,但是具有不同的接口的时候;
    • 当系统已经实现了某个功能,但用户想要通过另一种接口方式访问,而我们不想修改原有接口的时候;
    • 当使用的第三方组件的接口和系统中定义好的接口不同,但又不希望修改系统接口的时候。

    2、代码

      适配器模式有两种实现形式:类适配模式和对象适配模式。下面通过一个实例分别介绍这两种模式。

    需求:

      我们现在的系统中有一个现有的类Adaptee,这个类中有一个adapteeMethod()方法。但是用户不想用Adaptee这个累,他们想用一个他们自己提供的接口Target,这个接口中有一个targetMethod()方法。虽然这两个类的功能相同,但是Target毕竟是一个接口,我们无法直接调用Adaptee类中的方法,而且我们也不想再把我们千辛万苦写好的Adaptee类中的代码重新写一遍。我们该怎么办?

      在解决上面的问题之前,我们先给出Adaptee和Target中的代码:

      Adaptee类中的代码:

    public class Adaptee {
          public void adapteeMethod() {
               System.out.println("这是我们已经实现的功能!");
          }
    }

      Target接口中的代码:

    public interface Target {
          void targetMethod();
    }

      接下来,我们分别用类适配模式和对象适配模式定义Adapter适配器类,来解决上面的问题。

    2.1、类适配模式

      首先来看类适配模式的UML图:

     

      可以看到,类适配模式是将Adapter类直接继承Adaptee,这样就直接具有了Adaptee中的adapteeMethod()方法,然后直接在Adapter中实现的Target的targetMethod()方法中调用父类的方法即可达到适配效果。

      Adapter类中的代码如下:

    public class Adapter extends Adaptee implements Target {
     
          @Override
          public void targetMethod() {
               super.adapteeMethod();
          }
    }

      测试代码如下:

    public class Test {
          public static void main(String[] args) {
               Targettarget = new Adapter();
               target.targetMethod();
          }
    }

      运行结果如下图所示:

    2.2、对象适配模式

      同理,先来看对象适配模式的UML图:

     

      可以看到,Adapter不再继承Adaptee,而是持有一个Adaptee类的引用,即将一个Adaptee的对象引用到Adapter类中,这就是对象适配模式的思路。同样,在Adapter的targetMethod()方法中调用Adaptee对象的adapteeMethod()方法即可完成适配。

      Adapter类中的代码如下:

    public class Adapter implements Target {
          private Adaptee adaptee = new Adaptee();
     
          @Override
          public void targetMethod() {
               adaptee.adapteeMethod();
          }
    }

      测试代码与类适配模式的测试代码完全相同。运行结果如下图所示:

    以上就是对适配器模式AdapterPattern的介绍。

    最后贴出适配器模式的GitHub代码:【GitHub - Adapter】

  • 相关阅读:
    读《程序是怎样跑起来的》第七章有感
    读《程序是怎样跑起来的》第六章有感
    读《程序是怎样跑起来的》第五章有感
    读《程序是怎样跑起来的》第四章有感
    读《程序是怎样跑起来的》第三章有感
    读《怎样成为一个高手 183》有感
    读《程序是怎样跑起来的》第二章有感
    《程序是怎样跑起来的》第一章读后感
    我与计算机
    师生关系
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6211100.html
Copyright © 2011-2022 走看看