• 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 }

    运行结果:

  • 相关阅读:
    代码
    怎么创建scrollview
    tcp/Ip http
    游戏道具
    FPS interv
    调整音乐
    插入排序
    冒泡排序
    JSON详解
    设计模式系列(2) 工厂模式之简单工厂模式
  • 原文地址:https://www.cnblogs.com/SmallAndGreat/p/13613510.html
Copyright © 2020-2023  润新知