【HeadFirst 设计模式】适配器模式的C++实现
一、案例背景
可曾记得之前写过的鸭子游戏?在那个案例中,我们设计了一个抽象鸭子类以及绿头鸭,红头鸭,橡皮鸭等子类,假设现在要进行一场动物表演,需要四种鸭子在台上表演他们的技能:呱呱叫和飞翔,但是如你所见,我们现在只有三种鸭子:绿头鸭,红头鸭和橡皮鸭。正当你愁眉不展的时候,一只野生的火鸡出现在你的面前!现在,让我们想办法将这只火鸡“伪装”成鸭子来完成我们的任务吧!
二、案例分析
火鸡也会叫,但是它的叫声和鸭子不同,它并不能呱呱叫,而只能咕咕叫;它也会飞,但是由于体型过大,飞行距离一次却只有鸭子的五分之一;如何给这只火鸡乔装打扮骗过台下的观众呢?
这时,我们可以设计一个适配器类:该类继承自鸭子接口(因为这个类的作用就是将伙计变成鸭子),它的构造器接受一个待伪装者:即一个火鸡类的指针,由于继承了鸭子接口,它需要实现鸭子的quark和fly方法,为了实现伪装,不妨在quark方法中调用火鸡的咕咕叫方法,同理由于火鸡飞一次的距离只有鸭子的五分之一,那么在fly方法中可以让火鸡飞五次,通过这种方式实现伪装。
三、代码分析
#include <iostream>
using namespace std;
//鸭子抽象类
class Duck{
public:
virtual void quack() = 0;
virtual void fly() = 0;
};
//绿头鸭子类
class MallardDuck: public Duck{
public:
void quack() override{
cout<<"gua gua~~"<<endl;
}
void fly() override{
cout<<"I'm flying~"<<endl;
}
};
//火鸡
class Turkey{
public:
//火鸡不会呱呱叫,只会咕咕叫
virtual void gobble() = 0;
//火鸡会飞,但是飞不远
virtual void fly() = 0;
};
//野生火鸡
class WildTurkey : public Turkey{
public:
void gobble() override{
cout<<"Gobble gobble~"<<endl;
}
void fly() override{
cout<<"I'm flying a short distance~"<<endl;
}
};
//假设我们现在需要将伙计伪装成鸭子
class Adapter: public Duck{
Turkey* turkey;
public:
Adapter(Turkey* turkey){
this->turkey = turkey;
}
void quack() override{
turkey->gobble();
}
void fly() override{
//火鸡会飞,但是飞不远,假设一次鸭子飞行的距离等于五次火鸡飞行的距离
for(int i = 0; i<5;i++){
turkey->fly();
}
}
};
int main(){
Duck* duck = new MallardDuck();
Turkey* tuekey = new WildTurkey();
duck->quack();
duck->fly();
cout<<"---------"<<endl;
Adapter* adapter = new Adapter(tuekey);
adapter->quack();
adapter->fly();
delete duck;
delete tuekey;
return 0;
};