【设计模式】适配器模式

适配器模式(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接口,类似于转接头;

相关推荐
认真的酒窝7 小时前
自己动手开发编译器(十一)语义分析
java·开发语言
wbs_scy8 小时前
Linux C++ 高并发编程:线程池全链路深度解析,从原理到手撕实现
java·开发语言
JAVA面经实录9178 小时前
Linux 常用命令完整知识体系
java·linux·开发语言·汇编
贪玩的蛋挞8 小时前
C#与闭包
开发语言·c#
端庄的战斗机9 小时前
javascript 设计模式(文章很长,请自备瓜子,水果和眼药水)
开发语言·javascript·设计模式
Full Stack Developme10 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
C语言小火车11 小时前
C++ 堆排序深度精讲:基于完全二叉树的选择排序进化,最坏情况 O(n log n) 的稳定王者
开发语言·c++·算法·排序算法·堆排序
北冥you鱼11 小时前
abigen 最佳实践:从入门到精通,高效生成 Go 语言合约绑定
开发语言·golang·区块链
ALex_zry12 小时前
C++26 std::complex 结构化绑定详解:auto [re, im] = c
c语言·开发语言·c++
她说..13 小时前
Java 默认值设置方式
java·开发语言·后端·springboot