代理模式将原来类的真实的操作从调用者的视野里移开,可能还增加了一些调用者觉察不到的操作,不过从类设计者的立场来看这些都不影响调用者使用原先类的功能,为了保护一个类而多生成一个新类,不敢说思想十分正确,至少感到拐了一个弯才实现自己的目的有些不爽。 可能代理模式真正发挥威力的地方是从此衍生的动态代理方法吧。
- // ProxyParenter.cpp : Defines the entry point for the console application.
- //
- //代理模式是对象的结构模式,操作的目标主要是类对象
- //下面是比较经典又精简的一个例子:
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
- //抽象角色
- class ISubject
- {
- public:
- ISubject()
- {
- }
- virtual ~ISubject()
- {
- }
- public:
- virtual void Request() = 0;
- };
- //真实角色:实现了Subject的request()方法
- class CSubject:public ISubject
- {
- public:
- CSubject()
- {
- }
- virtual ~CSubject()
- {
- }
- public:
- virtual void Request()
- {
- cout << "CSubject::Request()" << endl;
- }
- };
- //代理角色
- class CProxySubject:public ISubject
- {
- public:
- CProxySubject(int nId)
- {
- this->m_nId = nId;
- }
- virtual ~CProxySubject()
- {
- }
- public:
- virtual void Request()
- {
- if (!this->PreRequest(this->m_nId))
- {
- cout << "request reject!" << endl;
- return;
- }
- this->m_objSub.Request();
- this->AfterRequest();
- }
- void SetId(int nId)
- {
- this->m_nId = nId;
- }
- int GetId()
- {
- return this->m_nId;
- }
- private:
- bool PreRequest(int nId)
- {
- if ( (nId > 0) && (nId <= 100) )
- {
- return true;
- }
- return false;
- }
- void AfterRequest()
- {
- cout << "After Do Request!" << endl;
- }
- private:
- CSubject m_objSub;
- int m_nId;
- };
- int main()
- {
- ISubject* pObj = NULL;
- int nId = 0;
- cout << "please input your id:" << endl;
- cin >> nId;
- pObj = new CProxySubject(nId);
- if (NULL != pObj)
- {
- pObj->Request();
- }
- //clear
- if (NULL != pObj)
- {
- delete pObj;
- pObj = NULL;
- }
- }