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 }

运行结果:

 

posted @ 2020-09-04 14:06  二是一种不三不亖的范  阅读(159)  评论(0编辑  收藏  举报