【设计模式】适配器模式

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

相关推荐
kkeeper~4 小时前
0基础C语言积跬步之深入理解指针(5下)
c语言·开发语言
一直不明飞行4 小时前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
盲敲代码的阿豪5 小时前
Python 入门基础教程(爬虫前置版)
开发语言·爬虫·python
多加点辣也没关系5 小时前
设计模式-解释器模式
设计模式·解释器模式
曹牧5 小时前
C# WinForms应用程序中展示JSON内容
c#
basketball6165 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
互联科技报5 小时前
2026超融合选型:Top5品牌与市场格局解读
开发语言·perl
weixin199701080165 小时前
[特殊字符] 智能数据采集:数字化转型的“数据石油勘探队”(附Python实战源码)
开发语言·python
想唱rap6 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++
@杰克成6 小时前
Java学习30
java·开发语言·学习