设计模式-适配器模式

一、定义

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

举一个生活中常见的例子,比如手机上的TypeC接口转3.5mm的二级插口的转换器,就是一个适配器,让不同的物理接口可以正常合作。

在实际的开发中,我们可能遇到系统中期望的接口和第三方提供的接口不一致,这时就可以通过适配器来转化,而不需要更改系统中已有的代码和第三方的代码,就像下图这样:

一、定义

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

举一个生活中常见的例子,比如手机上的TypeC接口转3.5mm的二级插口的转换器,就是一个适配器,让不同的物理接口可以正常合作。

在实际的开发中,我们可能遇到系统中期望的接口和第三方提供的接口不一致,这时就可以通过适配器来转化,而不需要更改系统中已有的代码和第三方的代码,就像下图这样:

二、实现

下面通过一个简单的例子来实现适配器模式,有一个鸭子接口、一个火鸡接口,现在鸭子的实现类不投用了,我们想用火鸡来冒充鸭子,就可以通过一个适配器来实现

鸭子接口中的叫是quack方法:

java 复制代码
public interface Duck {
    /**
     * 叫
     */
    void quack();
}
//一个实现类
public class GaDuck implements Duck{
    /**
     * 叫
     */
    @Override
    public void quack() {
        System.out.println("嘎嘎叫");
    }
}

火鸡接口中的叫是gobble方法:

java 复制代码
public interface Turkey {
    void gobble();
}
//一个实现类
public class GeTurkey implements Turkey{
    @Override
    public void gobble() {
        System.out.println("咯咯叫");
    }
}

要让火鸡来冒充鸭子,适配器需要实现鸭子接口方法,然后在鸭子独有的方法中调用火鸡独有的方法

java 复制代码
public class TurkeyAdapter implements Duck{
    private Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }
    
    @Override
    public void quack() {
        this.turkey.gobble();
    }
}

测试:

java 复制代码
public class Test {
    public static void main(String[] args) {
        test();
    }
    static void test(){
        Duck gaDuck = new GaDuck();
        Turkey geTurkey = new GeTurkey();
        Duck turkeyAdapter = new TurkeyAdapter(geTurkey);
        System.out.println("嘎嘎鸭叫:");
        testDuck(gaDuck);
        System.out.println("伪装成鸭子的火鸡叫:");
        testDuck(turkeyAdapter);
    }

    //测试鸭子
    static void testDuck(Duck duck){
        duck.quack();
    }
}
//输出
嘎嘎鸭叫:
嘎嘎叫
伪装成鸭子的火鸡叫:
咯咯叫

可以看到,具体的流程是这样的:

  1. 客户端testDuck(Duck duck)方法调用适配器中Duck接口的方法
  2. 适配器接收到请求,将会调用被适配者Turkey的方法
  3. 客户端收到了调用结果,但是并未察觉到适配器的作用

二、实现

下面通过一个简单的例子来实现适配器模式,有一个鸭子接口、一个火鸡接口,现在鸭子的实现类不投用了,我们想用火鸡来冒充鸭子,就可以通过一个适配器来实现

鸭子接口中的叫是quack方法:

java 复制代码
public interface Duck {
    /**
     * 叫
     */
    void quack();
}
//一个实现类
public class GaDuck implements Duck{
    /**
     * 叫
     */
    @Override
    public void quack() {
        System.out.println("嘎嘎叫");
    }
}

火鸡接口中的叫是gobble方法:

java 复制代码
public interface Turkey {
    void gobble();
}
//一个实现类
public class GeTurkey implements Turkey{
    @Override
    public void gobble() {
        System.out.println("咯咯叫");
    }
}

要让火鸡来冒充鸭子,适配器需要实现鸭子接口方法,然后在鸭子独有的方法中调用火鸡独有的方法

java 复制代码
public class TurkeyAdapter implements Duck{
    private Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }
    
    @Override
    public void quack() {
        this.turkey.gobble();
    }
}

测试:

java 复制代码
public class Test {
    public static void main(String[] args) {
        test();
    }
    static void test(){
        Duck gaDuck = new GaDuck();
        Turkey geTurkey = new GeTurkey();
        Duck turkeyAdapter = new TurkeyAdapter(geTurkey);
        System.out.println("嘎嘎鸭叫:");
        testDuck(gaDuck);
        System.out.println("伪装成鸭子的火鸡叫:");
        testDuck(turkeyAdapter);
    }

    //测试鸭子
    static void testDuck(Duck duck){
        duck.quack();
    }
}
//输出
嘎嘎鸭叫:
嘎嘎叫
伪装成鸭子的火鸡叫:
咯咯叫

可以看到,具体的流程是这样的:

  1. 客户端testDuck(Duck duck)方法调用适配器中Duck接口的方法
  2. 适配器接收到请求,将会调用被适配者Turkey的方法
  3. 客户端收到了调用结果,但是并未察觉到适配器的作用
相关推荐
珹洺1 小时前
C++从入门到实战(十)类和对象(最终部分)static成员,内部类,匿名对象与对象拷贝时的编译器优化详解
java·数据结构·c++·redis·后端·算法·链表
coderzpw1 小时前
设计模式中的“万能转换器”——适配器模式
设计模式·适配器模式
一 乐1 小时前
网红酒店|基于java+vue的网红酒店预定系统(源码+数据库+文档)
java·开发语言·数据库·毕业设计·论文·springboot·网红酒店预定系统
xyliiiiiL3 小时前
从责任链模式聊到aware接口
java·开发语言
码农老起6 小时前
与Aspose.pdf类似的jar库分享
java·pdf·jar
程序猿小D6 小时前
第三百八十九节 JavaFX教程 - JavaFX WebEngine
java·eclipse·intellij-idea·vr·javafx
三金C_C8 小时前
单例模式解析
单例模式·设计模式·线程锁
self-discipline6348 小时前
【Java】Java核心知识点与相应面试技巧(七)——类与对象(二)
java·开发语言·面试
wei3872452328 小时前
java笔记02
java·开发语言·笔记
zjj5879 小时前
Docker使用ubuntu
java·docker·eureka