适配器模式是一种结构型设计模式,主要用于将一个类的接口转换成另一个接口,以便原本由于接口不兼容而无法一起工作的类能够协同工作。该模式通过创建一个适配器类,将目标接口与适配者接口连接起来,实现不同接口之间的兼容性。
适配器模式的两种形式
-
类适配器
类适配器通过继承适配者类并实现目标接口来工作。在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.
-
对象适配器
对象适配器通过在适配器类中包含一个适配者对象,并实现目标接口来工作。当接收到目标接口的方法调用时,适配器类将这些调用委托给适配者对象。这种形式允许在运行时动态替换适配者对象。 例子:支付系统适配器
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
适配器模式的优缺点
优点:
-
复用性:可以复用现有的类,无需修改其源代码。
-
灵活性:可以在运行时动态替换适配者对象。
-
可维护性 :降低系统耦合度,易于维护和扩展。 缺点:
-
增加系统复杂性:引入新的类和接口,使系统更加复杂。
-
性能开销:适配器需要将目标接口的调用委托给适配者对象,带来一定的性能损失。
适配器模式的应用场景
-
现有类的接口与所需接口不兼容。
-
希望复用一些现有类,但其接口不符合要求。
-
在遗留代码中改造老的接口。
结论
适配器模式通过创建一个适配器类,桥接了不兼容的接口,使得原本无法一起工作的类能够协同工作。这种模式提高了系统的复用性和灵活性,但在使用时需注意其带来的复杂性和性能开销。根据具体场景选择合适的适配器形式(类适配器或对象适配器)能够有效地解决接口不兼容的问题。