适配器模式,是为了转变接口方式的一种模式。即通过一个中介,作为两个不兼容接口之间的桥梁(老接口与新接口),使原先的老对象不仅可以使用自身的老接口,而且还可以通过适配器类,用新接口对老对象进行操作。
实现方式如下:
所谓的Target接口就是用户所希望使用的新接口,Adaptee 就是我们原先的老对象。而Adapter 为适配器。上图表示适配器类实现了目标接口Target,它还包含了Adaptee对象,以方便在新接口中调用子对象子对象Adaptee的方法。
例如,对于电子设备来讲,必须输入标准电压和频率才可以正常运转。然而每个国家的标准并不一样,例如英国的标准电压使230V ,而中国的标准电压是220V。怎么样让英国的标准电器设备能在中国良好的工作,这中间就需要一个“中介”,让输入到新接口的电压是220V,经过处理后,原先的老对象接收到的230V。又例如,电器接收的是电信号,而声控电器输入的是声音信号,声音信号变成电信号的过程中就需要依赖适配器。
适配器模式示例如下:
//声音信号接收器的接口
class ISoundSignalReceiver{
public :
void receiver(SoundSignal s)=0;
}
//电器设备抽象类
class Electrical{
public:
void work(ElectricalSignal e)=0;
}
//电器设备能够接收声音信号的适配器类
class Adapter :public ISoundSignalReceiver{
private:
Electrical * electrical;
protected:
virtual ElectricalSignal SoundToElectrical(SoundSignal s){
// 声音信号转电信号的函数(可重载)
......
}
public:
Adapter(Electrical & el){ electrical=el; }
//实现新的接口
void receiver(SoundSignal s){
ElectricalSignal eSignal = SoundToElectrical(s);
electrical->work(eSignal );
}
}
实现具体的抽象类,和使用示例
//电灯
class Lamp:public Electrical{
public:
void work(ElectricalSignal e){
// .. 发热发光..
}
}
//电扇
class Fan:public Electrical{
public:
void work(ElectricalSignal e){
// .. 转动..
}
}
//使用示例
void mainProcess(SoundSignal soundSignal ){
Lamp lamp; //电灯
Fan fan ; //电扇
//声控电灯
Adapter soundlamp(lamp);
soundlamp.receiver(soundSignal);
//声控电扇
Adapter soundFan(fan);
soundFan.receiver(soundSignal);
}