设计模式C++描述----06.适配器(Adapter)模式

本文介绍了适配器模式的基本概念,包括其定义、应用场景及两种实现方式:类模式和对象模式,并通过示例代码详细解释了如何将不兼容的接口进行适配。

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

一. 定义

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

Adapter 模式的两种类别:类模式对象模式

二. 举例说明

实际中,我们为了完成某项工作购买了一个第三方的库来加快开发。这个库可能都是一些.dll文件,这就带来了一个问题!我们在应用程序中已经设计好了接口,与这个第三方提供的接口不一致,为了使得这些接口不兼容的类(不能在一起工作)可以在一起工作了,Adapter模式提供了将一个类(第三方库)的接口转化为客户(购买使用者)希望的接口的方法。

三. 代码实现

类模式的Adapter采用继承的方式复用Adaptee的接口。


//目标类,可以想像成客户所期代的接口
class Target
{
public:
    Target()
    {
    }

    virtual ~Target()
    {
    }

    virtual void Request()
    {
        std::cout<<"Target::Request"<<std::endl;
    }
};

//被适应者,可以看成 dll 提供的接口
class Adaptee
{
public:
    Adaptee()
    {
    }

    virtual ~Adaptee()
    {
    }

    void SpecificRequest()
    {
        std::cout<<"Adaptee::SpecificRequest"<<std::endl;
    }
};

//适配器类,通过在内部包装被适应者对象 adaptee
//把源接口(SpecificRequest)转换成目标接口(Request)
class Adapter: public Target, private Adaptee
{
public:
    void Request()
    {
        this->SpecificRequest();
    }
};


//测试代码
int main(int argc,char* argv[])
{
    Adaptee* ade = new Adaptee;
    Target* adt = new Adapter;

    adt->Request();

    return 0;
}

对象模式的Adapter中则采用组合的方式实现Adaptee的复用。


//目标类
class Target
{
public:
    virtual ~Target() {}
    
    virtual void Request()
    {
        std::cout<<"Target::Request"<<std::endl;
    }
};

//被适应类
class Adaptee
{
public:
    virtual ~Adaptee() {}

    void SpecificRequest()
    {
        std::cout<<"Adaptee::SpecificRequest"<<std::endl;
    }
};

//适配器类,用于转接两者的接口
class Adapter:public Target
{
public:
    Adapter(Adaptee* ade)
    {
        this->_ade= ade;
    }

    void Request()
    {
        _ade->SpecificRequest();
    }

private:
    Adaptee* _ade;
};


//测试代码
int main(int argc,char* argv[])
{
    Adaptee* ade = new Adaptee;
    Target* adt = new Adapter(ade);
    
    adt->Request();

    return 0;
}

四. 说明

1. 当接口不同时,首先不应该考虑用适配器,而是应该考虑通过重构统一接口。

2. 使用适配器模式是无奈之举,通常在软件开发后期或维护期再考虑使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值