013 --- 第17章 适配器模式
简述:
适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式包括:目标接口类、适配器类、被适配类。
目标接口类:这是客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。
适配器类:通过内部包装一个被适配类的对象,把源接口转换成目标接口。
被适配类:需要适配的类。
应用场景:系统得数据和行为都类似,但接口不符时,考虑使用适配器
注:开发环境调整为VS2017,操作系统win11
状态模式代码:
1 #include <iostream> 2 using namespace std; 3 4 // 目标接口类 5 class CTarget 6 { 7 public: 8 virtual void Request() 9 { 10 cout << "普通请求!" << endl; 11 } 12 }; 13 14 // 被适配类 15 class CAdaptee 16 { 17 public: 18 void SpecificRequest() 19 { 20 cout << "特殊请求!" << endl; 21 } 22 }; 23 24 // 适配器类 25 class CAdapter : public CTarget 26 { 27 private: 28 CAdaptee m_Adaptee; 29 30 public: 31 virtual void Request() 32 { 33 m_Adaptee.SpecificRequest(); 34 } 35 }; 36 37 int main() 38 { 39 CAdapter Adapter; 40 Adapter.Request(); 41 system("pause"); 42 return 0; 43 }
运行结果:
例:姚明在NBA打蓝球需要翻译
代码如下:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 // 球员基类(目标接口类) 6 class CPlayer 7 { 8 protected: 9 string m_szName; 10 11 public: 12 CPlayer(string szName) 13 { 14 m_szName = szName; 15 } 16 17 virtual void Attack() = 0; 18 virtual void Defense() = 0; 19 }; 20 21 // 前锋 22 class CForwards : public CPlayer 23 { 24 public: 25 CForwards(string szName) : CPlayer(szName) {} 26 27 void Attack() 28 { 29 cout << "前锋[" << m_szName << "]进攻" << endl; 30 } 31 32 void Defense() 33 { 34 cout << "前锋[" << m_szName << "]防守" << endl; 35 } 36 }; 37 38 // 中锋 39 class CCenter : public CPlayer 40 { 41 public: 42 CCenter(string szName) : CPlayer(szName) {} 43 44 void Attack() 45 { 46 cout << "中锋[" << m_szName << "]进攻" << endl; 47 } 48 49 void Defense() 50 { 51 cout << "中锋[" << m_szName << "]防守" << endl; 52 } 53 }; 54 55 // 后卫 56 class CGuards: public CPlayer 57 { 58 public: 59 CGuards(string szName) : CPlayer(szName) {} 60 61 void Attack() 62 { 63 cout << "后卫[" << m_szName << "]进攻" << endl; 64 } 65 66 void Defense() 67 { 68 cout << "后卫[" << m_szName << "]防守" << endl; 69 } 70 }; 71 72 // 外籍中锋(被适配类) 73 class CForeignCenter 74 { 75 private: 76 string m_szForeignName; 77 78 public: 79 void SetName(string szForeignName) 80 { 81 m_szForeignName = szForeignName; 82 } 83 84 string GetName() 85 { 86 return m_szForeignName; 87 } 88 89 void 进攻() 90 { 91 cout << "外籍中锋[" << m_szForeignName << "]进攻" << endl; 92 } 93 94 void 防守() 95 { 96 cout << "外籍中锋[" << m_szForeignName << "]防守" << endl; 97 } 98 }; 99 100 // 翻译者(适配器类) 101 class CTranslator : public CPlayer 102 { 103 private: 104 CForeignCenter ForeignCenter; 105 106 public: 107 CTranslator(string szName) : CPlayer(szName) 108 { 109 ForeignCenter.SetName(szName); 110 } 111 112 void Attack() 113 { 114 ForeignCenter.进攻(); 115 } 116 117 void Defense() 118 { 119 ForeignCenter.防守(); 120 } 121 }; 122 123 int main() 124 { 125 CForwards Forwards("巴蒂尔"); 126 Forwards.Attack(); 127 CGuards Guards("麦克格雷迪"); 128 Guards.Attack(); 129 CTranslator Translator("姚明"); 130 Translator.Attack(); 131 Translator.Defense(); 132 133 system("pause"); 134 return 0; 135 }
运行结果: