设计模式-适配器模式

一、定义

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

举一个生活中常见的例子,比如手机上的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. 客户端收到了调用结果,但是并未察觉到适配器的作用
相关推荐
thefool112266几秒前
多线程 4
java
Rain的Java大神之路17 分钟前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
高级程序源38 分钟前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
IT研究室1 小时前
最新计算机毕业设计选题推荐-基于spring boot的文学名著分享系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
denlaku1 小时前
JDK 13 新特性详解
java·开发语言
秋饼1 小时前
Java 后端企业级 LLM 网关实战:Spring Cloud Gateway 构建统一大模型接入层
java·ai·技术分享·后端开发
今年下半年1 小时前
【防重放】Spring Boot 通过自定义注解实现接口防重放
java·spring boot·自定义注解·防重放
WeiXin_DZbishe1 小时前
基于Node.js的马拉松赛事管理系统的设计与实现-计算机毕设 附源码【课程设计】90211
java·javascript·vue.js·python·php·课程设计
Wang's Blog1 小时前
Java 项目部署之 Docker工具快速入门: 使用 Docker 镜像命令练习
java·docker
企业数字化笔记1 小时前
多租户系统从哪里开始设计?租户身份、数据隔离、权限与套餐的整体方案
java·spring boot·后端·junit