设置模式之代理模式(Proxy Pattern) (C++源代码)

代理模式将原来类的真实的操作从调用者的视野里移开,可能还增加了一些调用者觉察不到的操作,不过从类设计者的立场来看这些都不影响调用者使用原先类的功能,为了保护一个类而多生成一个新类,不敢说思想十分正确,至少感到拐了一个弯才实现自己的目的有些不爽。 可能代理模式真正发挥威力的地方是从此衍生的动态代理方法吧。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值