013 --- 第17章 适配器模式

简述:

  适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

  适配器模式包括:目标接口类、适配器类、被适配类。

    目标接口类:这是客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。

    适配器类:通过内部包装一个被适配类的对象,把源接口转换成目标接口。

    被适配类:需要适配的类。

状态模式代码:

 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 }

运行结果:

原文地址:https://www.cnblogs.com/SmallAndGreat/p/13613510.html