适配器模式

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

适配器模式的两种形式

  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

适配器模式的优缺点

优点:

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

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

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

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

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

适配器模式的应用场景

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

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

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

结论

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

相关推荐
It's now15 小时前
Spring AI 基础开发流程
java·人工智能·后端·spring
cxh_陈15 小时前
线程的状态,以及和锁有什么关系
java·线程·线程的状态·线程和锁
计算机毕设VX:Fegn089515 小时前
计算机毕业设计|基于springboot + vue图书商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
R.lin16 小时前
Java 8日期时间API完全指南
java·开发语言·python
毕设源码-赖学姐16 小时前
【开题答辩全过程】以 高校教学质量监控平台为例,包含答辩的问题和答案
java·eclipse
高山上有一只小老虎16 小时前
翻之矩阵中的行
java·算法
火钳游侠16 小时前
java单行注释,多行注释,文档注释
java·开发语言
code bean16 小时前
【CMake】为什么需要清理 CMake 缓存文件?深入理解 CMake 生成器切换机制
java·spring·缓存
selt79117 小时前
Redisson之RedissonLock源码完全解析
android·java·javascript
RestCloud17 小时前
智能制造的底层基建:iPaaS 如何统一 ERP、MES 与 WMS 的数据流
java·wms·erp·数据传输·ipaas·mes·集成平台