在以下集中情况下可以用 Proxy模式解决问题:
1)创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF 称之为虚代理(Virtual Proxy);
2)为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出) ,我们将这个操纵的过程交给一个代理去完成,GoF 称
之为远程代理(Remote Proxy);
3)对对象进行控制访问的时候,比如在 Jive 论坛中不同权限的用户(如管理员、普通用户等)将获得不同层次的操作权限,我们将这个工作交给一个代理去完成,GoF 称之为保
护代理(Protection Proxy)。
4)智能指针(Smart Pointer)。
1 ////////////////////Proxy.h////////////////////////////////////////////////////// 2 #pragma once 3 class Subject 4 { 5 public: 6 virtual ~Subject() ; 7 virtual void Request() = 0 ; 8 protected: 9 Subject(); 10 private: 11 }; 12 13 class ConcreteSubject : public Subject 14 { 15 public: 16 ~ConcreteSubject(); 17 ConcreteSubject(); 18 void Request(); 19 protected: 20 private: 21 }; 22 class Proxy 23 { 24 public: 25 Proxy(); 26 Proxy(Subject* sub); 27 ~Proxy(); 28 void Request(); 29 protected: 30 private: 31 Subject* _sub ; 32 };
1 ///////////////Proxy.cpp/////////////////////////////////////////////////////////// 2 #include "Proxy.h" 3 #include <iostream> 4 using namespace std; 5 Subject::~Subject() 6 { 7 8 } 9 Subject::Subject() 10 { 11 12 } 13 ConcreteSubject::ConcreteSubject() 14 { 15 16 } 17 ConcreteSubject::~ConcreteSubject() 18 { 19 20 } 21 void ConcreteSubject::Request() 22 { 23 cout<<"ConcreteSubject......request...."<<endl; 24 } 25 26 Proxy::Proxy() 27 { 28 29 } 30 Proxy::Proxy(Subject* sub) 31 { 32 this->_sub = sub ; 33 } 34 35 Proxy::~Proxy() 36 { 37 delete _sub ; 38 } 39 40 void Proxy::Request() 41 { 42 cout<<"Proxy request...."<<endl; 43 _sub->Request(); 44 }
1 /////////////main.cpp///////////////////////////////////////////////////////////// 2 #include "Proxy.h" 3 #include <iostream> 4 int main() 5 { 6 Subject* sub = new ConcreteSubject(); 7 Proxy* p = new Proxy(sub); 8 p->Request(); 9 getchar(); 10 return 0; 11 12 }