设计模式-适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端期望的另一个接口。适配器模式使得原本由于接口不兼容而无法工作的类能够一起工作。


适配器模式的角色组成:

  1. 目标接口(Target)
    • 定义客户端需要的接口。
  2. 需要适配的类(Adaptee)
    • 现有的接口或类,其接口与目标接口不兼容。
  3. 适配器类(Adapter)
    • 实现目标接口,并通过内部调用需要适配的类的方法,使其行为符合目标接口。
  4. 客户端(Client)
    • 通过目标接口与适配器类交互。

示例代码:电源适配器

问题背景

假设有一个设备只能使用 110V 电压,但我们当前提供的是 220V 电压。我们需要通过适配器将 220V 转换成 110V,使设备能够正常工作。


实现代码

// 目标接口(Target):设备需要的电压
interface Voltage110V {
    void use110V();
}

// 被适配的类(Adaptee):现有的电压
class Voltage220V {
    public void provide220V() {
        System.out.println("提供220V电压");
    }
}

// 适配器类(Adapter):将220V转换为110V
class VoltageAdapter implements Voltage110V {
    private final Voltage220V voltage220V;

    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public void use110V() {
        System.out.println("通过适配器转换电压...");
        voltage220V.provide220V();
        System.out.println("电压已转换为110V,设备可以使用了!");
    }
}

// 客户端(Client)
public class AdapterPatternExample {
    public static void main(String[] args) {
        // 创建被适配的220V电压
        Voltage220V voltage220V = new Voltage220V();

        // 创建适配器
        Voltage110V adapter = new VoltageAdapter(voltage220V);

        // 使用适配器提供的110V电压
        adapter.use110V();
    }
}

输出结果:

通过适配器转换电压...
提供220V电压
电压已转换为110V,设备可以使用了!

适配器模式的优点:

  1. 兼容性强
    • 通过适配器可以将已有的类复用到新的环境中。
  2. 灵活性高
    • 可以对类进行解耦,使原有类和客户端不需要直接交互。
  3. 符合开闭原则
    • 不需要修改现有的类,而是通过新增适配器类实现功能。

适配器模式的缺点:

  1. 系统复杂度增加
    • 如果过多地使用适配器,可能会使系统结构复杂化。
  2. 性能开销
    • 适配器增加了额外的间接层,可能会影响性能。

适配器模式的适用场景:

  1. 现有的类或方法的接口与目标接口不兼容,但需要将它们集成。
  2. 需要复用一些现有的类,但它们的接口与当前系统不兼容。
  3. 想要封装旧系统中的类,并使其与新系统的接口匹配

适配器模式的常见应用:

  1. Java IO流中的适配器
    • InputStreamReaderInputStream 转换为 Reader
  2. 数据库访问框架
    • JDBC 驱动程序通过适配器实现统一的数据库访问接口。
  3. UI 框架
    • 将不同的事件处理方法适配到统一的接口中。

通过适配器模式,我们可以轻松解决接口不兼容的问题,实现类的复用和系统的灵活性。

posted @   庞某人  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 【.NET】调用本地 Deepseek 模型
历史上的今天:
2020-01-14 java学习第一课
点击右上角即可分享
微信分享提示