适配器模式

适配器模式是一种结构型设计模式,主要用于将一个类的接口转换成另一个接口,以便原本由于接口不兼容而无法一起工作的类能够协同工作。该模式通过创建一个适配器类,将目标接口与适配者接口连接起来,实现不同接口之间的兼容性。

适配器模式的两种形式

  1. 类适配器

    类适配器通过继承适配者类并实现目标接口来工作。在Java中,由于不支持多继承,通常采用组合的方式,即适配器类包含一个适配者对象,并将目标接口的方法调用委托给该对象。 例子:电子设备适配器

    java 复制代码
    // 目标接口
    public interface ElectronicDevice {
        void powerOn();
        void powerOff();
        void setVolume(int volume);
        void display();
    }
    // 适配者类
    public class OldTV {
        public void turnOn() {
            System.out.println("Old TV is turned on.");
        }
        public void turnOff() {
            System.out.println("Old TV is turned off.");
        }
        public void setVolumeLevel(int level) {
            System.out.println("Old TV volume set to " + level);
        }
        public void show() {
            System.out.println("Old TV is displaying.");
        }
    }
    // 类适配器
    public class OldTVAdapter implements ElectronicDevice {
        private OldTV oldTV;
        public OldTVAdapter(OldTV oldTV) {
            this.oldTV = oldTV;
        }
        @Override
        public void powerOn() {
            oldTV.turnOn();
        }
        @Override
        public void powerOff() {
            oldTV.turnOff();
        }
        @Override
        public void setVolume(int volume) {
            oldTV.setVolumeLevel(volume);
        }
        @Override
        public void display() {
            oldTV.show();
        }
    }
    // 测试类
    public class AdapterPatternDemo {
        public static void main(String[] args) {
            OldTV oldTV = new OldTV();
            ElectronicDevice electronicDevice = new OldTVAdapter(oldTV);
            electronicDevice.powerOn();
            electronicDevice.setVolume(10);
            electronicDevice.display();
            electronicDevice.powerOff();
        }
    }

    运行结果:

    复制代码
    Old TV is turned on.
    Old TV volume set to 10
    Old TV is displaying.
    Old TV is turned off.
  2. 对象适配器

    对象适配器通过在适配器类中包含一个适配者对象,并实现目标接口来工作。当接收到目标接口的方法调用时,适配器类将这些调用委托给适配者对象。这种形式允许在运行时动态替换适配者对象。 例子:支付系统适配器

    java 复制代码
    // 目标接口
    public interface Payment {
        void pay(double amount);
    }
    // 适配者类
    public class OldPaymentSystem {
        public void processPayment(double amount) {
            System.out.println("Processing payment of $" + amount);
        }
    }
    // 对象适配器
    public class OldPaymentSystemAdapter implements Payment {
        private OldPaymentSystem oldPaymentSystem;
        public OldPaymentSystemAdapter(OldPaymentSystem oldPaymentSystem) {
            this.oldPaymentSystem = oldPaymentSystem;
        }
        @Override
        public void pay(double amount) {
            oldPaymentSystem.processPayment(amount);
        }
    }
    // 测试类
    public class AdapterPatternDemo {
        public static void main(String[] args) {
            OldPaymentSystem oldPaymentSystem = new OldPaymentSystem();
            Payment payment = new OldPaymentSystemAdapter(oldPaymentSystem);
            payment.pay(100.0);
        }
    }

    运行结果:

    复制代码
    Processing payment of $100.0

适配器模式的优缺点

优点:

  • 复用性:可以复用现有的类,无需修改其源代码。

  • 灵活性:可以在运行时动态替换适配者对象。

  • 可维护性 :降低系统耦合度,易于维护和扩展。 缺点:

  • 增加系统复杂性:引入新的类和接口,使系统更加复杂。

  • 性能开销:适配器需要将目标接口的调用委托给适配者对象,带来一定的性能损失。

适配器模式的应用场景

  • 现有类的接口与所需接口不兼容

  • 希望复用一些现有类,但其接口不符合要求

  • 在遗留代码中改造老的接口

结论

适配器模式通过创建一个适配器类,桥接了不兼容的接口,使得原本无法一起工作的类能够协同工作。这种模式提高了系统的复用性和灵活性,但在使用时需注意其带来的复杂性和性能开销。根据具体场景选择合适的适配器形式(类适配器或对象适配器)能够有效地解决接口不兼容的问题。

相关推荐
一直不明飞行4 小时前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
REDcker4 小时前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
你的保护色5 小时前
【无标题】
java·服务器·网络
多加点辣也没关系5 小时前
设计模式-解释器模式
设计模式·解释器模式
basketball6165 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
淘矿人5 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
小江的记录本5 小时前
【Java基础】泛型:泛型擦除、通配符、上下界限定(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·mysql·spring·面试·职场和发展
来恩10036 小时前
请求转发与响应重定向的使用
java
@杰克成6 小时前
Java学习30
java·开发语言·学习
次元工程师!6 小时前
LangFlow开发(三)—Bundles组件架构设计(3W+字详细讲解)
java·前端·python·低代码·langflow