设计模式-适配器模式

一、定义

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

举一个生活中常见的例子,比如手机上的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 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
栗子~~2 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8292 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
未若君雅裁3 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
阿维的博客日记4 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI4 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
辰海Coding5 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构
小小编程路5 小时前
C++ 多线程与并发
java·jvm·c++
AI视觉网奇6 小时前
linux 检索库 判断库是否支持
java·linux·服务器