【设计模式】适配器模式

适配器模式(Adapter Pattern)
概念:

· 一种结构型设计模式;

· 目的是将一个类的接口转换为客户端所期望的接口,使原本不兼容的类可以协同工作;

UML结构:

复制代码
          +----------------+
          |    Target      |   <-- 客户端期望的接口
          |----------------|
          | +Request()     |
          +----------------+
                  ^
                  |  implements
                  |
          +----------------+
          |    Adapter     |   <-- 适配器
          |----------------|
          | -adaptee: Adaptee |
          | +Request()        |
          +----------------+
                  |
          +----------------+
          |   Adaptee      |   <-- 被适配者
          |----------------|
          | +SpecificRequest() |
          +----------------+

代码示例:

cs 复制代码
/// <summary>
/// 客户端希望的接口(目标接口)
/// </summary>
public interface ITarget
{
    void Request();
}

/// <summary>
/// 需要被适配的类
/// </summary>
public class Adaptee
{
    public void SpecificRequest()
    {
        Console.WriteLine("Adaptee: SpecificRequest called.");
    }
}

/// <summary>
/// 适配器
/// </summary>
public class Adapter : ITarget
{
    private readonly Adaptee _adaptee;

    public Adapter(Adaptee adaptee)
    {
        this._adaptee = adaptee;
    }

    public void Request()
    {
        _adaptee.SpecificRequest();
    }
}

/// <summary>
/// 客户端
/// </summary>
public class Client
{
    public static void Main()
    {
        // 创建一个需要被适配的对象
        Adaptee adaptee = new();
        // 生成一个适配器对象,并注入被适配的对象
        ITarget target = new Adapter(adaptee);
        // 调用统一接口
        target.Request();
    }
}

特点:
优点:

· 可以让两个原本接口不兼容的

· 符合开闭原则,无需修改已有的类的代码;

· 客户端透明调用 ,无需关心适配器的实现;
缺点:

· 增加系统的复杂度:多了一层适配器;

· 适配器的数量可能会随着类的增加而增加

· 过度使用可能会导致类层次的混乱

适用场景:

· 系统希望使用现有类,但接口不符合需求;

· 需要将多个已有类统一接口 ,便于客户端调用;

· 希望通过封装改变类的接口而不改变原有类;

举例场景

· 为旧版本只支持USB充电的手机适配一个Type-C接口,类似于转接头;

相关推荐
Meteors.2 小时前
23种设计模式——组合模式(Composite Pattern)
设计模式·组合模式
大飞pkz2 小时前
【设计模式】外观模式
开发语言·设计模式·c#·外观模式
青草地溪水旁2 小时前
设计模式(C++)详解——解释器模式(2)
c++·设计模式·解释器模式
西猫雷婶2 小时前
python学智能算法(三十九)|使用PyTorch模块的normal()函数绘制正态分布函数图
开发语言·人工智能·pytorch·python·深度学习·神经网络·学习
Humbunklung3 小时前
C# 压缩解压文件的常用方法
前端·c#·压缩解压
Asort4 小时前
JavaScript设计模式(三)——抽象工厂模式 (Abstract Factory)
前端·javascript·设计模式
liuyunshengsir4 小时前
-bash: ssh-copy-id: command not found的两种解决方法
开发语言·ssh·bash
lrh30254 小时前
设计模式-3D引擎中的设计模式
设计模式·3d引擎设计
脑花儿4 小时前
ABAP EXCEL模板数据上传 及 注意事项
开发语言·excel