设计模式:6. 适配器模式
还记得介绍“策略模式”时我们介绍的案例吗?现在游戏中不仅要有鸭子,还要增加火鸡。为了不做太多的改变,我们想让火鸡能够适配鸭子的接口。
之前鸭子的接口如下:
class Duck
{
public:
virtual void quack() = 0;
virtual void fly() = 0;
};
而我们的新角色,火鸡的接口是这样的:
class Turkey
{
public:
virtual void gobble() = 0;
virtual void fly() = 0; //可以飞,但飞的不远
};
那我们写个适配器吧,让火鸡也能够顺利的接入我们的游戏。
class TurkeyAdapter: public Duck
{
public:
TurkeyAdapter(Turkey* turkey): m_turkey(turkey) {}
void quack() override
{
m_turkey->gobble();
}
void fly() override
{
for (int i=0; i<5; ++i)
{
m_turkey->fly();
}
}
private:
Turkey* m_turkey;
};
这样,新加入的火鸡可以完全融入这个游戏中了。
int main()
{
MallardDuck* duck = new MallardDuck; // 具体的鸭子
WildTurkey* turkey = new WildTurkey; // 具体的火鸡
Duck* turkeyAdapter = new TurkeyAdapter(turkey);
testDuck(duck);
testDuck(turkeyAdapter);
return 0;
}
void testDuck(Duck *duck)
{
duck->quack();
duck->fly();
}
适配器模式除了上方演示的对象适配器,还有类适配器,类适配器需要编程语言支持多重继承。类适配器通过多重继承同时继承目标接口(Duck)和被适配者(Turkey),从而在适配器内部直接调用被适配者的方法,无需像对象适配器那样额外持有一个指针成员变量。由于篇幅有限,不做介绍。
给出适配器定义:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

浙公网安备 33010602011771号