适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
符合OO设计原则:使用对象组合,以修改的接口包装被适配者。被适配者的任何子类,都可以搭配着适配器使用。
当需要使用一个现有的类而其接口并不符合需要时,就使用适配器。
适配器将一个对象包装起来以改变其接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装”起来以简化其接口。
#include <iostream>
class Duck {
public:
virtual void quack() = 0;
virtual void fly() = 0;
};
class MallardDuck :public Duck {
public:
void quack() {
printf("Quack\n");
}
void fly() {
printf("I'm flying\n");
}
};
class Turkey {
public:
virtual void gobble() = 0;
virtual void fly() = 0;
};
class WildTurkey :public Turkey {
public:
void gobble() {
printf("Gobble gobble\n");
}
void fly() {
printf("I'm flying a short distance\n");
}
};
对象适配器
class TurkeyObjectAdapter :public Duck {
private:
Turkey* m_turkey;
public:
TurkeyObjectAdapter(Turkey* turkey) {
m_turkey = turkey;
}
void quack() {
m_turkey->gobble();
}
void fly() {
for (int i = 0; i < 3; i++) {
m_turkey->fly();
}
}
};
类适配器
class TurkeyClassAdapter :public Duck, WildTurkey {
public:
void quack() {
WildTurkey::gobble();
}
void fly() {
for (int i = 0; i < 2; i++) {
WildTurkey::fly();
}
}
};
使用者,客户
void testDuck(Duck* duck) {
duck->quack();
duck->fly();
}
测试
void main() {
MallardDuck* duck = new MallardDuck();
WildTurkey* turkey = new WildTurkey();
Duck* turkeyObjectAdapter = new TurkeyObjectAdapter(turkey);
Duck* turkeyClassAdapter = new TurkeyClassAdapter();
printf("The Turkey says...\n");
turkey->gobble();
turkey->fly();
printf("\nThe Duck says...\n");
testDuck(duck);
printf("\nThe turkeyObjectAdapter says...\n");
testDuck(turkeyObjectAdapter);
printf("\nThe turkeyClassAdapter says...\n");
testDuck(turkeyClassAdapter);
}
参考:
1. EricFreeman, FreemanElisabeth, 弗里曼, et al. Head First设计模式[M]. 中国电力出版社, 2007.