【设计模式】适配器模式(C++)

概述

    适配器模式属于结构型模式,结构型模式描述如何将类或者对 象结合在一起形成更大的结构,就像搭积木,可以通过 简单积木的组合形成复杂的、功能更为强大的结构。结构型模式有类结构型模式和对象结构型模式。
适配器模式的定义
    将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。
适用的场景
     1.系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码。
     2.想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

对象适配器

在实际开发中,对象适配器的使用频率更高,UML图如下:
在这里插入图片描述
适配器模式的组成角色
Target:目标抽象类,定义我们需要的的目标接口长相。
Adaptee:适配者类,要被转换的源角色。
Adapter:适配器类,模式的核心,通过类继承或者类关联的方式把适配者转换为目标接口。
Client:客户类。

对象适配器代码体现

//目标抽象类
class Target
{
public:
    virtual void request();
};
//适配者
class Adaptee
{
//适配者类中客户端想要调用的方法
public:
    void specificrequest();
};
//适配器类
class Adapter : public Target
{
public:
    Adapter(Adaptee* ada)
    {
        adaptee = ada;
    }
    void request
    {
        adaptee->specificrequest();
    }
private:
    Adaptee* adaptee;
};
//使用
int main()
{
    Adaptee* adaptee = new Adaptee();
    Target *tar = new Adapter(adaptee);
    tar->request();
    return 0;
}

    看起来适配器类好像就是拥有了适配者成员变量,所以可以调用到适配者的方法,那直接在目标类里调用也是一样的,为啥还要用适配器?因为,适配器模式是适用于目标类和接口都已经无法修改,但是还想使用一些现有的但是和自己接口不匹配的方法的情况。

类适配器模式

    类适配器模式和对象适配器模式最大的区别在于适配器和适配者之间的关系不同,对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系。
代码体现

//其他角色代码一致,区别在于适配器
class Adapter : public Target, Adaptee
{
    void request()
    {
        specificrequest();
    }
};

    该适配器继承了目标类和适配者类,可以直接调用目标接口。但是如果Adaptee是一个final类(不允许继承的类),那类适配器模式不能使用,且Java,C#等语言不支持多继承的,类适配器模式也受到限制。

缺省适配器模式

    当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求,它适用于不想使用一个接口中的所有方法的情况,又称为单接口适配器模式。
    缺省适配器模式在实际开发中应用比较广泛,也很容易理解。

模式的优缺点

对象适配器和类适配器共同的优点:
    1.适配器模式可以让两个没有任何关系的类在一起运行。
    2.将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。
    3.增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。
    4.灵活性和扩展性很好,通过更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。
类适配器的优点
    由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
对象适配器的优点:
    1.一个对象适配器可以把多个不同的适配者适配到同一个目标;
    2.可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据“里氏代换原则”,适配者的子类也可通过该适配器进行适配。
类适配器的缺点:
    1.对于Java、C#等不支持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者;
    2.适配者类不能为最终类,如在Java中不能为final类,C#中不能为sealed类;类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性。
对象适配器的缺点
    与类适配器模式相比,要在适配器中置换适配者类的某些方法比较麻烦。如果一定要置换掉适配者类的一个或多个方法,可以先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值