设计模式之适配器模式

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();
        }
    }
相关推荐
咖啡の猫2 小时前
原型模式详解与实践
设计模式·原型模式
青岚岁叶5 小时前
设计模式——泛型单例类
单例模式·设计模式·unity3d
weixin_307779138 小时前
解耦Java应用程序的方法和技巧
java·设计模式
zhulangfly11 小时前
【Java设计模式-1】单例模式,Java世界的“独苗”
java·单例模式·设计模式
Leaf吧11 小时前
java设计模式 单例模式
java·单例模式·设计模式
JINGWHALE112 小时前
设计模式 结构型 桥接模式(Bridge Pattern)与 常见技术框架应用 解析
前端·人工智能·后端·设计模式·性能优化·系统架构·桥接模式
苹果13 小时前
C++二十三种设计模式之抽象工厂模式
c++·设计模式·抽象工厂模式
憶巷13 小时前
代理模式和适配器模式有什么区别
代理模式·适配器模式
silver68713 小时前
代理模式详解
设计模式
玉面小君13 小时前
C# 设计模式(行为型模式):责任链模式
设计模式·c#·责任链模式