23种设计模式之《适配器模式(Adapter)》在c#中的应用及理解

程序设计中的主要设计模式通常分为三大类,共23种:

1. 创建型模式(Creational Patterns)

  • 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。

  • 工厂方法模式(Factory Method):定义创建对象的接口,由子类决定实例化哪个类。

  • 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。

  • 建造者模式(Builder):将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示。

  • 原型模式(Prototype):通过复制现有对象来创建新对象。

2. 结构型模式(Structural Patterns)

  • 适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口。

  • 桥接模式(Bridge):将抽象部分与实现部分分离,使它们可以独立变化。

  • 组合模式(Composite):将对象组合成树形结构以表示"部分-整体"的层次结构。

  • 装饰器模式(Decorator):动态地给对象添加职责,相比生成子类更为灵活。

  • 外观模式(Facade):为子系统中的一组接口提供一个统一的接口。

  • 享元模式(Flyweight):通过共享技术有效地支持大量细粒度对象。

  • 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。

3. 行为型模式(Behavioral Patterns)

  • 责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者与接收者耦合。

  • 命令模式(Command):将请求封装为对象,使你可以用不同的请求对客户进行参数化。

  • 解释器模式(Interpreter):给定一个语言,定义其文法的一种表示,并定义一个解释器。

  • 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示。

  • 中介者模式(Mediator):定义一个中介对象来封装一系列对象之间的交互。

  • 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

  • 观察者模式(Observer):定义对象间的一对多依赖关系,当一个对象改变状态时,所有依赖者都会收到通知并自动更新。

  • 状态模式(State):允许对象在其内部状态改变时改变其行为。

  • 策略模式(Strategy):定义一系列算法,将它们封装起来,并使它们可以互相替换。

  • 模板方法模式(Template Method):定义一个操作中的算法骨架,将一些步骤延迟到子类中。

  • 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

4.适配器模式(Adapter Pattern)简介

适配器模式是一种结构型设计模式,它允许不兼容的接口之间进行协作。适配器模式通过将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

适配器模式通常用于以下场景:

  1. 集成第三方库:当你需要使用一个第三方库,但其接口与你的代码不兼容时,可以使用适配器模式来封装第三方库的接口,使其与你的代码兼容。
  2. 复用旧代码:当你有一些旧的代码,它们与新系统的接口不兼容时,可以使用适配器模式来复用这些旧代码。
  3. 统一接口:当你希望统一多个类的接口时,可以使用适配器模式来提供一个统一的接口。

适配器模式有两种实现方式:

  1. 类适配器:通过继承来实现适配器。
  2. 对象适配器:通过组合来实现适配器。

5.C# 适配器模式演示代码

下面是一个使用对象适配器模式的C#示例代码。

场景描述

假设我们有一个旧的 LegacyPrinter 类,它有一个 PrintDocument 方法,但它的接口与新系统的 IPrinter 接口不兼容。我们需要创建一个适配器 PrinterAdapter,使得 LegacyPrinter 可以与新系统一起工作。

代码实现
复制代码

csharp

using System;

// 目标接口:新系统的打印机接口
public interface IPrinter
{
    void Print(string document);
}

// 被适配者:旧的打印机类
public class LegacyPrinter
{
    public void PrintDocument(string document)
    {
        Console.WriteLine($"Legacy Printer: {document}");
    }
}

// 适配器:将旧的打印机类适配到新系统的打印机接口
public class PrinterAdapter : IPrinter
{
    private readonly LegacyPrinter _legacyPrinter;

    public PrinterAdapter(LegacyPrinter legacyPrinter)
    {
        _legacyPrinter = legacyPrinter;
    }

    public void Print(string document)
    {
        // 调用旧的打印机类的PrintDocument方法
        _legacyPrinter.PrintDocument(document);
    }
}

// 客户端代码
public class Client
{
    public static void Main(string[] args)
    {
        // 创建旧的打印机对象
        LegacyPrinter legacyPrinter = new LegacyPrinter();

        // 创建适配器,将旧的打印机适配到新系统的打印机接口
        IPrinter printer = new PrinterAdapter(legacyPrinter);

        // 使用新系统的打印机接口打印文档
        printer.Print("Sample Document");
    }
}
代码说明
  1. 目标接口 IPrinter :这是新系统的打印机接口,定义了一个 Print 方法。

  2. 被适配者 LegacyPrinter :这是旧的打印机类,它有一个 PrintDocument 方法,与新系统的 IPrinter 接口不兼容。

  3. 适配器 PrinterAdapter :这个类实现了 IPrinter 接口,并在内部持有一个 LegacyPrinter 对象。PrinterAdapterPrint 方法调用了 LegacyPrinterPrintDocument 方法,从而将旧的打印机接口适配到新系统的打印机接口。

  4. 客户端代码 Client :在客户端代码中,我们创建了一个 LegacyPrinter 对象,然后通过 PrinterAdapter 将其适配到 IPrinter 接口。最后,我们使用 IPrinter 接口的 Print 方法来打印文档。

输出结果

运行上述代码后,输出将会是:

Legacy Printer: Sample Document

6.总结

通过适配器模式,我们成功地将旧的 LegacyPrinter 类适配到了新系统的 IPrinter 接口,使得旧代码可以在新系统中继续使用。适配器模式在不修改现有代码的情况下,实现了接口的兼容性,是一种非常有用的设计模式。

相关推荐
DemonAvenger4 小时前
深入Go并发编程:Goroutine性能调优与实战技巧全解析
设计模式·架构·go
啾啾Fun5 小时前
[Java基础-线程篇]7_线程设计模式与总结
java·开发语言·设计模式
Dontla6 小时前
C++设计模式总结
开发语言·c++·设计模式
JuicyActiveGilbert6 小时前
【C++设计模式】第十篇:外观模式(Facade)
c++·设计模式·外观模式
yuanpan6 小时前
23种设计模式之《装饰器模式(Decorator)》在c#中的应用及理解
设计模式·c#·装饰器模式
程序员云帆哥6 小时前
【玩转23种Java设计模式】结构型模式篇:组合模式
java·设计模式·组合模式
techzhi6 小时前
设计模式-原型模式
设计模式·原型模式
JuicyActiveGilbert8 小时前
【C++设计模式】第八篇:组合模式(Composite)
c++·设计模式·组合模式
诗水人间10 小时前
设计模式 + java8方法引用 实现任意表的过滤器
设计模式
烟锁池塘柳010 小时前
Pipeline模式详解:提升程序处理效率的设计模式
人工智能·深度学习·设计模式