ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 适配器模式定义 将一个类的接口转换成客户希望的另外一种接口。适配器模式使得原来由于接口不兼容而不能一起工作的那些类可以一起工作。 ## 适配器模式的功能 适配器模式的主要功能是进行转换匹配,目的是复用已有的功能,而不是来实现新的接口。也就是说,客户端需要的功能应该是已经实现好的,不需要适配器模式来实现,适配器模式主要负责把不兼容的接口转换成客户期望的样子就可以了。 但这不是说,在适配器里面就不需要实现功能。适配器里面可以实现功能,称这种适配器为智能适配器。再说了,在接口匹配和转换的过程中,也有可能需要额外实现一定的功能,才能转换过来,比如需要调整参数以进行匹配等。 ## 举例 现在假设你缺少鸭子对象(叫声为Quack,飞行输出”I’m flying”),想用一些火鸡对象(叫声为”gobble” 飞行输出”I’m flying a short distance”)来冒充。显而易见,因为火鸡的接口(行为)不同,所以我们不能公然拿来使用。 URL设计: ![](https://img.kancloud.cn/d1/0a/d10aa398f043f27cb0c1338ba4050d2c_527x289.png) ## 代码实现 ```cpp #include <iostream> #include <memory> /** * 定义鸭子类 */ class Duck { public: virtual void quack() = 0; // 嘎嘎叫 virtual void fly() = 0; virtual ~Duck() {} }; /** * 定义绿头鸭 */ class MallardDuck : public Duck { public: void quack() { std::cout << "quack" << std::endl; } void fly() { std::cout << "I'm flying" << std::endl; } }; /** * 定义火鸡 */ class Turkey { public: virtual void gobble() = 0; // 咯咯叫 virtual void fly() = 0; virtual ~Turkey() {} }; /** * 定义野火鸡 */ class WildTurkey : public Turkey { public: void gobble() { std::cout << "gobble" << std::endl; } void fly() { std::cout << "I'm flying a short distance" << std::endl; } }; /** * 定义火鸡适配器, 适配Duck的接口 */ class TurkeyAdapter : public Duck { public: TurkeyAdapter(Turkey* turkey) : turkey_(turkey) {} void quack() { turkey_->gobble(); } void fly() { turkey_->fly(); } private: Turkey* turkey_; }; void test() { std::shared_ptr<Duck> duck_ptr(new MallardDuck()); duck_ptr->quack(); duck_ptr->fly(); std::shared_ptr<Turkey> wt_ptr(new WildTurkey()); std::shared_ptr<TurkeyAdapter> ta_ptr(new TurkeyAdapter(wt_ptr.get())); ta_ptr->quack(); ta_ptr->fly(); } int main() { test(); return 0; } ``` 输出结果: ``` quack I'm flying gobble I'm flying a short distance ```