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