欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-13 12:32:52
...

适配器(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地址

其他设计模式:设计模式学习笔记​​​​​​​