设计模式-适配器模式

一、定义

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

举一个生活中常见的例子,比如手机上的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. 客户端收到了调用结果,但是并未察觉到适配器的作用
相关推荐
经典19925 分钟前
spring boot 详解以及原理
java·spring boot·后端
星光54226 分钟前
飞算JavaAI:给Java开发装上“智能引擎”的超级助手
java·开发语言
学习3人组35 分钟前
JVM GC长暂停问题排查
java
R_AirMan1 小时前
深入浅出Redis:一文掌握Redis底层数据结构与实现原理
java·数据结构·数据库·redis
人生在勤,不索何获-白大侠1 小时前
day17——Java集合进阶(Collections、Map)
java·开发语言
程序员小羊!1 小时前
Java教程:JavaWeb ---MySQL高级
java·开发语言·mysql
白仑色1 小时前
Spring Boot 多环境配置详解
java·spring boot·后端·微服务架构·配置管理
超级小忍1 小时前
在 Spring Boot 中优化长轮询(Long Polling)连接频繁建立销毁问题
java·spring boot·后端
David爱编程2 小时前
Java 中 Integer 为什么不是万能的 int 替代品?
java·后端
老马啸西风2 小时前
个人网站一键引入免费开关评论功能 giscus
java