设计模式之适配器模式

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();
        }
    }
相关推荐
海特伟业4 小时前
隧道调频广播覆盖-隧道调频广播无线覆盖系统建设要点、难点分析与解决应对
运维·设计模式
sg_knight4 小时前
设计模式实战:享元模式(Flyweight)
python·设计模式·享元模式·flyweight
Swift社区7 小时前
AI 时代,ArkUI 的设计模式会改变吗?
人工智能·设计模式
数据中穿行7 小时前
访问者设计模式全方位深度解析
设计模式
宁雨桥7 小时前
前端设计模式面试题大全
前端·设计模式
数据中穿行8 小时前
迭代器设计模式全方位深度解析
设计模式
数据中穿行8 小时前
观察者设计模式全方位深度解析
设计模式
程序员Terry9 小时前
别老写重复代码了!模版方法模式一次讲透
java·设计模式
数据中穿行9 小时前
建造者模式全方位深度解析
设计模式
数据中穿行9 小时前
组合设计模式全方位深度解析
设计模式