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. 使用适配器模式是无奈之举,通常在软件开发后期或维护期再考虑使用。
适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
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. 使用适配器模式是无奈之举,通常在软件开发后期或维护期再考虑使用。
相关文章推荐
- PHP 实现适配器(Adapter)模式
- Java 实现适配器(Adapter)模式
- PHP 实现适配器(Adapter)模式
- Head First设计模式C++实现--第七章:适配器(Adapter)与外观(Facade)模式
- Java 实现适配器(Adapter)模式
- 适配器(Adapter)设计模式和接口实现完全解耦
- 适配器(Adapter)模式的Java实现[00原创]
- 设计模式笔记--结构型模式之一适配器 adapter
- 设计模式之Adapter适配器设计模式
- 设计模式-----Adapter(适配器)模式
- 适配器(Adapter)模式
- Adapter 适配器 (结构型模式)
- Adapter(适配器)模式
- 设计模式之适配器(Adapter)---类对象结构型模式
- 设计模式之Adapter(适配器)
- 设计模式之Adapter(适配器)
- 结构模式(Structural Pattern)==适配器(Adapter)模式
- 设计模式之Adapter模式(适配器)
- 结构型模式-适配器 Structural Patterns- Adapter
- Java设计模式:Adapter(适配器)