适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作
适配器模式的别名为包装器(Wrapper)模式,它既可以作为类结构型模式,也可以作为对象结构型模式。在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合。
结构:
类适配器模式结构图:
对象适配器结构图:
适配器模式的适用性:
具体可参考:
分别利用类版本和对象版本的适配器模式模拟实现ps2接口和usb接口的转换。
我们手中有个ps2插头的设备,但是主机上只有usb插头的接口,实现一个适配器将ps2接口转换为usb接口。其中,ps2接口表示为:
class Ps2{
virtual void isPs2();
}
class Usb{
Virtual void isusb();
}。
类适配器模式代码
C++
#include<iostream>
using namespace std;
/*
分别利用类版本和对象版本的适配器模式模拟实现ps2接口和usb接口的转换。
我们手中有个ps2插头的设备,但是主机上只有usb插头的接口,实现一个适配器将ps2接口转换为usb接口。其中,ps2接口表示为:
class Ps2{
virtual void isPs2();
}
Usb接口表示为:
class Usb{
Virtual void isusb();
}。
*/
class Usb{ //target
public:
virtual void isusb(){
cout<<"USB接口"<<endl;
};
};
class Ps2{ //adaptee
public:
void isPs2(){
cout<<"Ps2"<<endl;
};
};
class Adapter: public Usb, private Ps2{
void isusb(){
isPs2();
}
};
int main(){
Usb* usb = new Adapter();
usb->isusb();
return 0;
}
对象适配器代码
C++
#include<iostream>
using namespace std;
class Ps2{ //adaptee
public:
void isPs2(){
cout<<"Ps2"<<endl;
};
};
class Usb{ //target
public:
virtual void isusb(){
cout<<"USB接口"<<endl;
};
};
class Adapter: public Usb{
public:
void isusb(){
ps2->isPs2();
}
private:
Ps2 * ps2 = new Ps2();
};
int main(){
Usb* usb = new Adapter();
usb->isusb();
return 0;
}
两个均调用的为SpecificRequest();
①本次实验掌握并编码了适配器模式的类与对象的两种不同方法。
②在实现类适配器和对象适配器时,注意,对象适配器模式中的“目标接口”和“适配者类”的代码同类适配器模式一样,只要修改适配器类和客户端的代码即可。