Bootstrap

适配器模式

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

适配器模式的两种形式

  1. 类适配器

    类适配器通过继承适配者类并实现目标接口来工作。在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. 对象适配器

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

    // 目标接口
    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
    

适配器模式的优缺点

优点:

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

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

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

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

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

适配器模式的应用场景

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

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

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

结论

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

;