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

适配器(Adpater),顾名思义,与我们平时生活中常见的电源转换头一样,起着转换的作用,是用来适配的中间件,连接原本不匹配的两类。


适配器模式

定义:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

  • 类适配器
  • 对象适配器
  • 接口适配器

UML图

  • 目标:目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类
  • 转换类:所有的请求都委托给被适配者
  • 适配器:适配器与被适配者组合

例子

类适配器

原理:通过继承来实现适配器功能。

当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后再继承接口B的实现类BB,这样我们可以在适配器P中访问接口B的方法了,这时我们在适配器P中的接口A方法中直接引用BB中的合适方法,这样就完成了一个简单的类适配器。

现在我们有个安卓手机的充电器,但是事实上我们需要一个苹果手机的充电器,现在需要一个转换器来帮我们做到这点,给我们的苹果手机充上电,这时候可以试试类适配器。

package adapter;

/**
 * 安卓充电器
 */
public interface Android {
    void isAndroid();
}
package adapter;

/**
 * 苹果充电器
 */
public interface iPhone {
    void isIPhone();
}
package adapter;

/**
 * 要适配者的具体实现类
 */
public class iPhone6s implements iPhone {
    @Override
    public void isIPhone() {
        System.out.println("I'm iPhone");
    }
}

定义一个转换器

package adapter;

public class iPhoneAdapter extends iPhone6s implements Android {
    @Override
    public void isAndroid() {
        isIPhone();
    }
}

测试

package test.adapter;

import adapter.Android;
import adapter.iPhoneAdapter;

public class test {
    public static void main(String args[]){
        Android android = new iPhoneAdapter();
        android.isAndroid();
    }
}

对象适配器

原理:通过组合来实现适配器功能。

当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后在适配器P中定义私有变量C(对象)(B接口指向变量名),再定义一个带参数的构造器用来为对象C赋值,再在A接口的方法实现中使用对象C调用其来源于B接口的方法。

package adapter;

/**
 * 安卓充电器
 */
public interface Android {
    void isAndroid();
}
package adapter;

/**
 * 苹果充电器
 */
public interface iPhone {
    void isIPhone();
}
package adapter;

/**
 * 对象适配器
 */
public class iPhoneAdapter2 implements Android {
    private iPhone iPhone;

    public iPhoneAdapter2(adapter.iPhone iPhone) {
        this.iPhone = iPhone;
    }

    @Override
    public void isAndroid() {
        iPhone.isIPhone();
    }
}

测试

package test.adapter;

import adapter.Android;
import adapter.iPhone6s;
import adapter.iPhoneAdapter;
import adapter.iPhoneAdapter2;

public class test2 {
    public static void main(String args[]){
        Android android = new iPhoneAdapter2(new iPhone6s());
        android.isAndroid();
    }
}

接口适配器

原理:通过抽象类来实现适配,这种适配稍别于上面所述的适配。

当存在这样一个接口,其中定义了N多的方法,而我们现在却只想使用其中的一个到几个方法,如果我们直接实现接口,那么我们要对所有的方法进行实现,哪怕我们仅仅是对不需要的方法进行置空(只写一对大括号,不做具体方法实现)也会导致这个类变得臃肿,调用也不方便,这时我们可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,而在抽象类中所有的方法都进行置空,那么我们在创建抽象类的继承类,而且重写我们需要使用的那几个方法即可。

package adapter;

public interface interfaceA {
    void methoA();
    void methodB();
    void methodC();
    void methodD();
}
package adapter;

public abstract class Adapter implements interfaceA{
    @Override
    public void methoA() {

    }

    @Override
    public void methodB() {

    }

    @Override
    public void methodC() {

    }

    @Override
    public void methodD() {

    }
}
package adapter;

public class concreteA extends Adapter {
    @Override
    public void methoA() {
        System.out.println("1");
    }

    @Override
    public void methodB() {
        System.out.println("2");
    }
}

小结

类适配器与对象适配器的极其相似,只是细节处稍显不同,两者都可适用于:

  • 想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
  • 我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。

对于接口适配器,在想使用某些方法而不想全部实现时,可以使用。


源码在这里:我的github地址


猜你喜欢

转载自blog.csdn.net/lpckr94/article/details/81186426