设计模式之适配器模式

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();
        }
    }
相关推荐
qq_297574679 小时前
设计模式系列文章(基础篇第19篇):中介者模式——封装交互关系,解耦网状依赖
设计模式·交互·中介者模式
AI大法师10 小时前
老牌媒体怎么从“出版物更新”走到“品牌系统升级”
大数据·人工智能·设计模式·新媒体运营
野生技术架构师11 小时前
Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍
java·开发语言·设计模式
艾利克斯冰11 小时前
Java设计模式-创建型模式(更新完成)
设计模式
王_teacher11 小时前
23种设计模式之工厂模式
设计模式·软件工程·简单工厂模式·工厂方法模式·抽象工厂模式
geovindu12 小时前
python:Coroutines Pattern
开发语言·python·设计模式·协程模式
sycmancia13 小时前
Qt——模型视图设计模式
设计模式
玖玥拾1 天前
C/C++ 基础笔记(十一)类的进阶
c语言·c++·设计模式·
geovindu1 天前
go: Broadcast Pattern
开发语言·后端·设计模式·golang·广播模式
我爱cope1 天前
【Agent智能体23 | 规划-规划工作流】
人工智能·设计模式·语言模型·职场和发展