适配器模式

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

适配器模式的两种形式

  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

适配器模式的优缺点

优点:

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

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

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

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

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

适配器模式的应用场景

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

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

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

结论

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

相关推荐
AI人工智能+电脑小能手14 小时前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
不是光头 强14 小时前
Java 后端 AI 技术选型与学习路线
java·人工智能·学习
paopaokaka_luck15 小时前
基于springboot3+vue3的文山民族文化资源展示与推广平台(协同过滤算法、Echarts 图形化分析)
java·前端·spring boot·学习·echarts
eralong15 小时前
Java IO 与 NIO
java·后端
Jesse_EC15 小时前
我给消息推送加了 Publisher Confirm,然后亲手引入了一个竞态
java
S3rein15 小时前
JAVA多线程手撕
java·多线程
用户81818706274615 小时前
第7章 死锁排查实录:jstack定位死锁的完整流程
java·后端
刀锋000115 小时前
Java 工程师转 AI Agent 最短路径:用 Spring 的思维理解 Spring AI 2.0(附 LangChain4j 对照)
java·人工智能·spring boot·spring·ai agent
喵同志不止步于码农16 小时前
Java Caffeine 快速入门
java·开发语言·后端·并发·缓存一致性
Java成神之路-16 小时前
Java 并发灵魂拷问:notify/signal 唤醒顺序是规范还是实现?
java