在生活中,我们对于适配器并不陌生,比如智能的稳压器,还有充电宝对安卓和苹果手机的转换接口,都是适配器的一种。适配器模式,是为了,将一个类的接口转换成希望的接口,优点是使得原本不兼容的接口,可以一起工作。这也让我们引出面向对象的另一个重要概念,我们要针对接口而不是针对实现编程,即细节依赖抽象,抽象不依赖细节。
具体示例如下(自己动手敲一下,感觉绝对不同):
#pragma once #include<stdio.h> #include <string> using std::string; class Player { public: Player(string name) :m_name(name){ } virtual void attack(){ } virtual void defense(){ } protected: string m_name; }; class Forward :public Player { public: Forward(string name) :Player(name){} virtual void attack() { printf("前锋进攻\n"); } virtual void defense() { printf("前锋防守\n"); } }; class Guards :public Player { public: Guards (string name) : Player(name){} virtual void attack() { printf("后卫进攻\n"); } virtual void defense() { printf("后卫防守\n"); } }; //模拟不兼容接口,不继承Player class ForgainCenter { public: virtual void attack() { printf("外籍中锋进攻\n"); } virtual void defense() { printf("外籍中锋防守\n"); } public: string m_name; }; //适配器 class Translator :public Player { public: Translator(string name) : Player(name) { m_center.m_name = name; } virtual void attack() { m_center.attack(); } virtual void defense() { m_center.defense(); } private: ForgainCenter m_center; }; int main() { Player * qf = new Forward("格林斯潘"); qf->defense(); qf->attack(); Player * hw = new Guards("韦斯布鲁"); hw->defense(); hw->attack(); Player * ts = new Translator("大姚"); ts->attack(); ts->defense(); } 在这里我们看到了组合的身影。组合优于继承,关键是,有时候,我们实在不好区分应该用组合还是继承。一个推荐的原则是,不确定该使用什么策略时,就是用组合!