设计模式-适配器模式

一、定义

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

举一个生活中常见的例子,比如手机上的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 小时前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java
Advancer-2 小时前
第二次蓝桥杯总结(上)
java·算法·职场和发展·蓝桥杯
\xin2 小时前
pikachu自编SQL(POST)
java·数据库·sql
一行代码一行诗++2 小时前
注释是什么和注释该怎么写(C语言)
java·前端·javascript
JAVA面经实录9172 小时前
企业级java+LangChain4j-RAG系统 限流熔断降级
java·开发语言·分布式·langchain
Drug2 小时前
Struts2 从入门到放弃?不,这些核心知识你依然需要掌握
java
Slow菜鸟3 小时前
Codex CLI 教程(五)| AI 驱动项目从零到一:面向 Java 全栈工程师打造个人 ECC(V2版)
java·开发语言·人工智能
月落归舟3 小时前
java基础之拷贝、单例
java·单例·拷贝
鬼蛟3 小时前
什么是 Git
java
直奔標竿3 小时前
SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
java·开发语言·人工智能·spring boot·后端·spring