設定模式之代理模式(Proxy Pattern) (C++原始碼)

來源:互聯網
上載者:User
代理模式將原來類的真實的操作從調用者的視野裡移開,可能還增加了一些調用者覺察不到的操作,不過從類設計者的立場來看這些都不影響調用者使用原先類的功能,為了保護一個類而多產生一個新類,不敢說思想十分正確,至少感到拐了一個彎才實現自己的目的有些不爽。 可能代理模式真正發揮威力的地方是從此衍生的動態代理方法吧。
  1. // ProxyParenter.cpp : Defines the entry point for the console application.
  2. //
  3. //代理模式是對象的結構模式,操作的目標主要是類對象
  4. //下面是比較經典又精簡的一個例子:
  5. #include "stdafx.h"
  6. #include <iostream>
  7. using namespace std;
  8. //抽象角色
  9. class ISubject
  10. {
  11. public:
  12.     ISubject()
  13.     {
  14.     }
  15.     virtual ~ISubject()
  16.     {
  17.     }
  18. public:
  19.     virtual void Request() = 0;
  20. };
  21. //真實角色:實現了Subject的request()方法
  22. class CSubject:public ISubject
  23. {
  24. public:
  25.     CSubject()
  26.     {
  27.     }
  28.     virtual ~CSubject()
  29.     {
  30.     }
  31. public:
  32.     virtual void Request()
  33.     {
  34.         cout << "CSubject::Request()" << endl;
  35.     }
  36. };
  37. //代理角色
  38. class CProxySubject:public ISubject
  39. {
  40. public:
  41.     CProxySubject(int nId)
  42.     {
  43.         this->m_nId = nId;
  44.     }
  45.     virtual ~CProxySubject()
  46.     {
  47.     }
  48. public:
  49.     virtual void Request()
  50.     {
  51.         if (!this->PreRequest(this->m_nId))
  52.         {
  53.             cout << "request reject!" << endl;
  54.             return;
  55.         }
  56.         this->m_objSub.Request();
  57.         this->AfterRequest();
  58.     }
  59.     void SetId(int nId)
  60.     {
  61.         this->m_nId = nId;
  62.     }
  63.     int GetId()
  64.     {
  65.         return this->m_nId;
  66.     }
  67. private:
  68.     bool PreRequest(int nId)
  69.     {
  70.         if ( (nId > 0) && (nId <= 100) )
  71.         {
  72.             return true;
  73.         }
  74.         return false;
  75.     }
  76.     void AfterRequest()
  77.     {
  78.         cout << "After Do Request!" << endl;
  79.     }
  80. private:
  81.     CSubject    m_objSub;
  82.     int         m_nId;
  83. };
  84. int main()
  85. {
  86.     ISubject* pObj = NULL;
  87.     int nId = 0;
  88.     cout << "please input your id:" << endl;
  89.     cin >> nId;
  90.     pObj = new CProxySubject(nId);
  91.     
  92.     if (NULL != pObj)
  93.     {
  94.         pObj->Request();
  95.     }
  96.     //clear
  97.     if (NULL != pObj)
  98.     {
  99.         delete pObj;
  100.         pObj = NULL;
  101.     }
  102. }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.