设计模式——适配器模式

适配器模式是一种设计模式,它将不兼容的接口转换为客户期望的接口,使得原本无法一起工作的类能够协同工作。适配器模式包括目标抽象类、适配器类和适配者类。通过具体的应用场景,如篮球比赛中的翻译和耳机接口转换,展示了适配器模式的实际作用。该模式的优点在于解耦、增强复用性和灵活性,但同时也存在一次仅能适配一个类、适配者不能为最终类等限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初识

适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

结构

在这里插入图片描述

由图可知适配器模式包含三个角色:

1:Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于C#语言不支持多重继承,所以它只能是接口。

2:Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。它是适配器模式的核心。

3:Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。

实现

static void Main(string[] args)
{
    Target targer = new Target();

    targer.Request();
    Console.Read();
}

class Target
{
    public virtual void Request()
    {
        Console.WriteLine("普通请求!");
    }
}
class Adaptee
{
    public void SpecificRequset()
    {
        Console.WriteLine("特殊请求!");
    }
}

class Adapter:Target
{
    private Adaptee adaptee = new Adaptee();
    public override void Request()
    {
        adaptee.SpecificRequset();
    }
}

应用

应用一

用适配器模式模拟篮球比赛中教练分配给前锋、中锋、后卫的任务,其中包括外籍运动员(外籍运动员是听不懂教练说的英语的)。

类图
在这里插入图片描述

分析:

外籍球员相当于适配器模式中的适配者类,翻译者相当于适配器的角色。球员类是抽象类,类中有抽象方法,这样,子类可以重写父类中的方法。有了翻译者类,外籍球员就可以很清晰的与球员进行交流。否则,则不能。所以说,这个例子中的翻译者类,(也就是适配器模式中的适配器类)是此模式的核心部分。

应用二

我们平时用的耳机接口有2.5mm和3.5mm之分,比如我新买的耳机是2.5mm接口的,而手机的耳机孔只能插3.5mm接口的耳机。而这时我又不想重新买一个耳机,也不想换手机,这时,适配器就派上用场了。适配器就能实现2.5mm接口的耳机插在3.5mm耳机孔的手机上了。

优点

1:将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无需修改原有结构。

2:增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一适配者类可以在多个不同的系统中复用。

3:灵活性和扩展性都非常好,通过使用配置文件,可以很方便的更换适配器,也可以在不修改原有代码的基础上 增加新的适配器,完全复合开闭原则。

缺点:

1:一次最多只能适配一个适配者类,不能同时适配多个适配者。

2:适配者类不能为最终类,在C#中不能为sealed类

3:目标抽象类只能为接口,不能为类,其使用有一定的局限性。

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值