设计模式之适配器模式

1.适配器模式

  • 适配器模式(Adapter Pattern)
    • 见名知意,是作为两个不兼容的接口之间的桥梁,属于结构型模式
    • 适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
  • 常见的几类适配器
    • 类的适配器模式
      • 想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可
    • 对象的适配器模式
      • 想将一个对象转换成满足另一个新接口的对象时,可以创建一个适配器类,持有原类的一个实例,在适配器类的方法中,调用实例的方法就行
    • 接口的适配器模式
      • 不想实现一个接口中所有的方法时,可以创建一个Adapter,实现所有方法,在写别的类的时候,继承Adapter类即可
  • 应用场景
    • 电脑需要读取内存卡的数据,读卡器就是适配器
    • 日常使用的转接头,如电源转换头、电压转换头
    • JDK中InputStreamReader就是适配器
    • JDBC就是我们用的最多的适配器模式
      • JDBC给出一个客户端通用的抽象接口,每一个具体数据库厂商,如SQL Server、Oracle、MySQL等,就会开发JDBC驱动,就是一个介于JDBC接口和数据库引擎接口之间的适配器软件
  • 优点
    • 可以让任何两个没有关联的类一起运行,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
    • 增加灵活度,提高复用性,适配器类可以在多个系统使用,符合开闭原则
  • 缺点
    • 整体类的调用链接增加,本来A可以直接调用C,使用适配器后A调用B,B再调用C

2.接口适配器

  • 接口适配器

    • 有些接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要实现部分接口就可以了
  • 代码示例

    java 复制代码
    /**
     * 支付接口
     */
    interface Pay {
        /**
         * 下单
         */
        void unifiedOrder();
    
        /**
         * 退款
         */
        void refund();
    }
    
    /**
     * 适配器
     */
    class PayAdapter implements Pay {
    
        @Override
        public void unifiedOrder() {
            System.out.println("适配器 下单");
        }
    
        @Override
        public void refund() {
            System.out.println("适配器 退款");
        }
    }
    
    class OnlyRefund extends PayAdapter {
        @Override
        public void refund() {
            System.out.println("OnlyRefund---退款");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            OnlyRefund onlyRefund = new OnlyRefund();
            onlyRefund.refund();
            onlyRefund.unifiedOrder();
        }
    }

3.类的适配器

  • 类的适配器模式

    • 想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可

  • 代码示例

    java 复制代码
    /**
     * 老的原始类
     */
    class OldModule {
        public void methodA() {
            System.out.println("原始类 methodA");
        }
    }
    
    /**
     * 新的目标接口
     */
    interface TargetModule {
    
        /**
         * 需要和适配的类方法名一样
         */
        void methodA();
    
        /**
         * 新的方法
         */
        void methodB();
    }
    
    /**
     * 适配器
     */
    class Adapter extends OldModule implements TargetModule {
        @Override
        public void methodB() {
            System.out.println("适配器 methodB");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Adapter adapter = new Adapter();
            adapter.methodA();
            adapter.methodB();
        }
    }
相关推荐
Zane199414 小时前
同一段单例代码,为什么在高并发下偶尔会创建出两个实例?聊聊哪种单例实现才是真的安全
设计模式
Carl_奕然14 小时前
【智能体】Loop 的四种设计模式之:Agent Loop(2026 最新版)
人工智能·设计模式·语言模型
小酒星小杜15 小时前
画 AI 漫画,别只会写“日漫风”:10 种画风、适用故事和可复制提示词
人工智能·设计模式·程序员
sarasuki1 天前
为什么 Agent 工具需要一个「协议」而不是「框架」:MCP 成为标准的底层逻辑
设计模式·agent·mcp
vivo互联网技术1 天前
知识不是文件,也不是向量 | KDC 系列 02
人工智能·设计模式·架构
Zane19947 天前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
怕浪猫8 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane19948 天前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19949 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..9 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot