重温设计模式 --- 适配器模式

2023-10-22 16:37:56 浏览数 (1)

引言

适配器模式是一种结构型设计模式,用于将一个类的接口转换成另一个接口,以便于两个不兼容的类之间能够协同工作。适配器模式可以被认为是一个桥梁,它可以连接两个不同的接口,从而使得它们可以进行协同工作。

适配器模式通常在两个不兼容的类之间进行转换,这些类可能具有不同的接口,不同的数据类型或不同的方法签名。适配器模式通过将一个类的接口转换为另一个类的接口来解决这个问题,这样这两个不同的类就可以协同工作了。

适配器模式分为两种类型,类适配器模式和对象适配器模式。

  • 类适配器模式:通过多重继承的方式,将适配者类的接口转换为目标接口。
  • 对象适配器模式:通过组合的方式,将适配者类的接口转换为目标接口。

下面我们使用C#来实现适配器模式。

创建目标接口

代码语言:javascript复制
// 目标接口
public  interface  ITarget
{
    void Request();
}

创建原有类

代码语言:javascript复制
// 原有类
public  class  Adaptee
{
    public void SpecificRequest()
    {
        Console.WriteLine("Adaptee.SpecificRequest");
    }
}

类适配器模式

类适配器模式通过继承实现适配器功能,它继承了原有类并实现了新的接口。这样,客户端就可以通过适配器调用原有类的方法。

  1. 创建类适配器
代码语言:javascript复制
// 类适配器
public  class  Adapter : Adaptee, ITarget
{
    public void Request()
    {
        this.SpecificRequest();
    }
}
  1. 创建客户端
代码语言:javascript复制
// 客户端代码
public  class  Client
{
    public void DoWork(ITarget target)
    {
        target.Request();
    }
}

可以这样调用:

代码语言:javascript复制
// 使用类适配器模式
Client client = new Client();

ITarget adapter = new Adapter();

client.DoWork(adapter);

适配器Adapter继承原有类Adaptee,实现了ITarget接口,并在Request方法中调用了基类的SpecificRequest方法,这样客户端就达到了通过适配器调用原有类的方法。

对象适配器模式

对象适配器模式通过组合实现适配器功能,它将原有类的对象作为一个成员变量包含在适配器类中。这样,客户端就可以通过适配器调用原有类的方法。

代码语言:javascript复制
// 对象适配器
public  class  Adapter : ITarget 
{
    private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee)
    {
        this.adaptee = adaptee;
    }
    
    public void Request() 
    {
        this.adaptee.SpecificRequest();
    }
}
  1. 创建客户端
代码语言:javascript复制
// 客户端代码
public  class  Client
{
    public void DoWork(ITarget target)
    {
        target.Request();
    }
}

可以这样调用:

代码语言:javascript复制
Client client = new Client();

Adaptee adaptee = new Adaptee();

ITarget adapter = new Adapter(adaptee);

client.DoWork(adapter);

适配器Adapter实现了ITarget接口,并持有了原有类的对象作为一个成员变量,使用含参构造的方式将原有类对象初始化,在Request方法中调用了原有类的SpecificRequest方法,这样客户端就达到了通过适配器调用原有类的方法。

结论

如果我们需要在现有代码中添加新的功能,而又不能修改原有的代码,那么适配器模式就是一个非常好的解决方案。适配器模式可以将不兼容的接口转换成兼容的接口,从而让不兼容的代码能够协同工作。

0 人点赞