您的位置:首页 > 编程语言 > C语言/C++

C++设计模式实现--适配器(Adapter)模式

2014-06-16 11:00 260 查看
一. 定义

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

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

二. 举例说明

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

三. 代码实现

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



[cpp] view
plaincopy

//目标类,可以想像成客户所期代的接口

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的复用。



[cpp] view
plaincopy

//目标类

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. 使用适配器模式是无奈之举,通常在软件开发后期或维护期再考虑使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: