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 }

 

posted @ 2020-11-08 13:59  昨日明眸  阅读(449)  评论(0)    收藏  举报