设计模式之适配器模式

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();
        }
    }
相关推荐
剧中有戏15 小时前
抽象工厂模式从入门到精通:一个多云存储案例的完整剖析(修订版)
设计模式
MC皮蛋侠客19 小时前
Redis 系列(八):缓存设计模式与一致性——从 Cache Aside 到防雪崩
redis·缓存·设计模式
莫得感情 o20 小时前
设计模式 18 · 状态模式
设计模式·状态模式
莫得感情 o21 小时前
设计模式 17 · 责任链模式
设计模式·责任链模式
用户938515635071 天前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战
前端·设计模式·typescript
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
今天的砖头有点烫手啊2 天前
AI Agent 开发实战(十):Agent 设计模式(ReAct / Plan-Execute / Reflection)
人工智能·react.js·设计模式
董员外2 天前
RAG 系统进化论(十):可运营 RAG,从原型到长期运行的知识系统
人工智能·后端·设计模式
莫得感情 o2 天前
设计模式 15 · 模板方法模式
设计模式·模板方法模式