Proxy(代理)
12. Proxy(代理)
12.1 定义
为其他对象提供一种代理以控制对这个对象的访问
按照使用目的可以将代理划分为以下几种。
■ 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局部代表对象。这个不同的地址空间可以是在本机器中,也可以在另一台机器中。
■ 虚拟(Virtual)代理:有时需要创建一些消耗较多资源的对象,可以首先创建代理对象,而将真实对象的创建延迟。例如,加载一个很大的图片,可以通过图片的代理来代替真正的图片。
■ 保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。
■ 缓存(Cache)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
■ 同步(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
■ 智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,例如,记录访问的流量和次数等。
12.2 代理模式的优点
■ 职责清晰:真实的角色实现实际的业务逻辑,不用关心其他非本职的事务,通过后期的代理完成附加的事务,附带的结果就是编程简洁清晰。
■ 高扩展性:具体主题角色随需求不同可能有很多种,但只要实现了接口,代理类就完全可以在不做任何修改的情况下代理各种真实主题角色。
■ 智能化:代理类可以在运行时才确定需要去代理的真实主题,这是一种强大的功能。
1 #include<iostream> 2 using namespace std; 3 //IGamePlayer接口对游戏玩家进行抽象 4 class IGamePlayer{ 5 public: 6 virtual void killBoss() = 0;//杀怪 7 virtual void upGrade() = 0;//升级 8 }; 9 //GamePlayer实现IGamePlayer接口中的方法 10 class GamePlayer:public IGamePlayer{ 11 public: 12 GamePlayer(string name){ 13 m_name = name; 14 } 15 void killBoss(){ 16 cout<<m_name<<"在打怪"<<endl; 17 } 18 void upGrade(){ 19 cout<<m_name<<"成功升级"<<endl; 20 } 21 private: 22 string m_name; 23 }; 24 //GamePlayerProxy是代理类 25 class GamePlayerProxy:public IGamePlayer{ 26 public: 27 GamePlayerProxy(IGamePlayer* player){ 28 this->player = player; 29 } 30 void killBoss(){ 31 this->log(); 32 player->killBoss(); 33 } 34 void upGrade(){ 35 player->upGrade(); 36 this->count(); 37 } 38 private: 39 IGamePlayer* player = NULL; 40 void log(){ 41 cout<<"打怪时间XXX"<<endl; 42 } 43 void count(){ 44 cout<<"升一级耗费5小时"<<endl; 45 } 46 }; 47 int main(){ 48 IGamePlayer* player = new GamePlayer("AA"); 49 IGamePlayer* prox = new GamePlayerProxy(player); 50 prox->killBoss(); 51 prox->upGrade(); 52 delete player; 53 player = NULL; 54 delete prox; 55 prox = NULL; 56 57 }
我心自有明月在,不堕地狱不跪佛

浙公网安备 33010602011771号