参考:http://blog.jobbole.com/109381/
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
比如购买的第三方开发组件,该组件接口与我们自己系统的接口不相同,或者由于某种原因无法直接调用该组件,可以考虑适配器。
适配器模式分为类模式和对象模式
案例:中国人去欧洲旅游,由于欧标规定双脚电源的都为O字口,而中国人用1字口的充电器,这时中国人给设备充电则需要适配器Dispatcher。
一.类模式
类模式的实现方式为多继承,通过public继承获得接口继承的效果,通过private继承获得实现继承的效果。
C++代码
#include <iostream> using namespace std; class IEuropeSocket{
public:
virtual void charge() = ;
}; class ChineseCharger{
public:
void chargeWithFeetFlat(){
cout << "Charge with Chinese charger"<<endl;
}
}; class PowerAdapter:public IEuropeSocket, private ChineseCharger{
public:
virtual void charge(){
cout << "use Chinese charger and a Europe adapter"<< endl;
this->chargeWithFeetFlat();
}
}; int main()
{
PowerAdapter *adapter = new PowerAdapter();
adapter->charge();
return ;
}
Java代码
public interface IEuropeSocket {
void charge();
} public class ChineseCharger {
void chargeWithFeetFlat(){
System.out.println("Charge with Chinese charger");
}
} public class PowerAdapter extends ChineseCharger implements IEuropeSocket{ public void charge(){
System.out.println("use Chinese charger and a Europe adapter");
chargeWithFeetFlat();
}
} public class Main {
public static void main(String[] args){
PowerAdapter adapter = new PowerAdapter();
adapter.charge();
}
}
二.对象模式
对象模式的实现方式为将适配者作为适配器类的成员。
C++代码
#include <iostream> using namespace std; class IEuropeSocket{
public:
virtual void charge() = ;
}; class ChineseCharger{
public:
void chargeWithFeetFlat(){
cout << "Charge with Chinese charger"<<endl;
}
}; class PowerAdapter:public IEuropeSocket{
private:
ChineseCharger *m_charger;
public:
PowerAdapter(ChineseCharger* p){m_charger = p;} virtual void charge(){
cout << "use Chinese charger and a Europe adapter"<< endl;
m_charger->chargeWithFeetFlat();
}
}; int main()
{
PowerAdapter *adapter = new PowerAdapter(new ChineseCharger());
adapter->charge();
return ;
}
Java代码
public interface IEuropeSocket {
void charge();
} public class ChineseCharger {
void chargeWithFeetFlat(){
System.out.println("Charge with Chinese charger");
}
} public class PowerAdapter implements IEuropeSocket{ private ChineseCharger charger; PowerAdapter(ChineseCharger charger) {
System.out.println("use Chinese charger and a Europe adapter");
this.charger = charger;
} public void charge() {
charger.chargeWithFeetFlat();
}
} public class Main {
public static void main(String[] args){
PowerAdapter adapter = new PowerAdapter(new ChineseCharger());
adapter.charge();
}
}