适配器模式

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

适配器模式的两种形式

  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

适配器模式的优缺点

优点:

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

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

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

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

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

适配器模式的应用场景

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

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

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

结论

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

相关推荐
考虑考虑10 小时前
Jpa使用union all
java·spring boot·后端
用户37215742613511 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊12 小时前
Java学习第22天 - 云原生与容器化
java
渣哥13 小时前
原来 Java 里线程安全集合有这么多种
java
间彧14 小时前
Spring Boot集成Spring Security完整指南
java
间彧14 小时前
Spring Secutiy基本原理及工作流程
java
数据智能老司机15 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
Java水解15 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
数据智能老司机16 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
洛小豆17 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试