代理模式

尽管Decorator的实现部分与代理相似,但Decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。

意图:

为其他对象提供一种代理以控制对这个对象的访问。

适用性:

在需要用比较通用和复杂的对象指针代替简单的的指针的时候,使用代理模式。

1、远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

2、虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。

3、安全代理,用来控制真实对象访问的权限。

4、智能指引,取代了简单的指针,它在访问对象时执行一些附加操作。

UML:

    

参与者:

Proxy

— 保存一个引用使得代理可以访问实体。若RealSubject和Subject的接口相同,proxy会引用Subject。

— 提供一个与Subject的接口相同的接口,这样代理就可以用来代替实体。

— 控制对实体的存取,并可能负责创建和删除它。

— 其它功能依赖于代理的类型。

Subject

— 定义RealSubject和Proxy的共用接口,这样就可以在任何使用RealSubject的地方都可以使用Proxy。

RealSubject

— 定义Proxy所代表的实体。

代码实现:

一、大话设计模式里面的例子:小王想追求小娟,但他不认识小娟。但他的朋友小林认识小娟,所以他通过让小林帮忙送礼物的方式追求小娟。

这里的小林就是我们的代理!

首先,我们实现一个女孩类:

class Girl{
public:
Girl(char* name = ""):mName(name){}
char* getName()
{
return mName;
}
private:
char* mName;
};

送礼物的接口:

class GiveGift
{
public:
virtual void GiveDolls() = ;
virtual void GiveFlowers() = ;
virtual void GiveChocolate() = ;
};

送礼物实例类(小王)

class Puisuit : public GiveGift
{
public:
Puisuit(Girl mm):mGirl(mm){} virtual void GiveDolls()
{
cout<<"送"<<mGirl.getName()<<"玩具!"<<endl;
} virtual void GiveFlowers()
{
cout<<"送"<<mGirl.getName()<<"鲜花!"<<endl;
} virtual void GiveChocolate()
{
cout<<"送"<<mGirl.getName()<<"巧克力!"<<endl;
}
private:
Girl mGirl; };

送礼物代理类(小林)

class Proxy : public GiveGift
{
public:
Proxy(Girl mm)
{
mPuisuit = new Puisuit(mm);
} virtual void GiveDolls()
{
mPuisuit->GiveDolls();
} virtual void GiveFlowers()
{
mPuisuit->GiveFlowers();
} virtual void GiveChocolate()
{
mPuisuit->GiveChocolate();
}
private:
Puisuit* mPuisuit; };

客户端代码:

#include <iostream>
#include "Proxy.h" using namespace std; int main()
{
Girl mm("小娟");
Proxy pro(mm);
pro.GiveChocolate();
pro.GiveDolls();
pro.GiveFlowers(); return ;
}

二、游戏中,通过代理来控制不同vip玩家的游戏权限。

基本操作接口

class Play
{
public:
virtual void Play1() = ;
virtual void Play2() = ;
virtual void Play3() = ;
};

操作类:

class Player:public Play
{
public:
void Play1()
{
cout<<"战役"<<endl;
}
void Play2()
{
cout<<"军团"<<endl;
}
void Play3()
{
cout<<"神器"<<endl;
} };

不同vip玩家的代理:

class ProxyPlayerVip0:Play
{
public:
ProxyPlayerVip0()
{
mPlayer = new Player;
}
void Play1()
{
mPlayer->Play1();
} void Play2()
{
cout<<"没有权限"<<endl;
} void Play3()
{
cout<<"没有权限"<<endl;
} private:
Play* mPlayer;
}; class ProxyPlayerVip1:Play
{
public:
ProxyPlayerVip1()
{
mPlayer = new Player;
}
void Play1()
{
mPlayer->Play1();
} void Play2()
{
mPlayer->Play2();
} void Play3()
{
cout<<"没有权限"<<endl;
} private:
Play* mPlayer;
};

客户端代码:

    ProxyPlayerVip0 pro5;
pro5.Play1();
pro5.Play2();
pro5.Play3(); ProxyPlayerVip1 pro1;
pro1.Play1();
pro1.Play2();
pro1.Play3();

结果:

战役

没有权限

没有权限

战役

军团

没有权限

代理模式(Proxy)C++实现的更多相关文章

  1. 代理模式/proxy模式/结构型模式

    代理模式proxy 定义 为其他对象提供一种代理,并以控制对这个对象的访问.最简单的理解,买东西都是要去商店的,不会去工厂. java实现三要素 proxy(代理)+subject(接口)+realS ...

  2. 代理模式(Proxy pattern)

    代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...

  3. 13.代理模式(Proxy Pattern)

    using System; namespace Test { //抽象角色:声明真实对象和代理对象的共同接口. //代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象, //同时代理 ...

  4. 大熊君说说JS与设计模式之------代理模式Proxy

    一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...

  5. 【转】设计模式(十一)代理模式Proxy(结构型)

    设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ...

  6. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  7. 代理模式 PROXY Surrogate 结构型 设计模式(十四)

    代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...

  8. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...

  9. 设计模式——代理模式(Proxy Pattern)

    代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...

  10. 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释

    代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...

随机推荐

  1. http 请求头示例

      POST /3-0/app/account/item HTTP/1.1 Host 10.100.138.32:8046 Content-Type application/json Accept-E ...

  2. js消息框

    <script> function del(obj, id) { layer.confirm('是否要删除信息!', { btn: ['确定', '取消'] }, function (in ...

  3. mysql安装包下载地址

    1.打开mysql官网 :https://dev.mysql.com/ 2.选择 downlad-->windows-->MySQL Installer -->滑动至页面底部,选择第 ...

  4. Apex语言(八)类和对象

    1.类和对象 一切皆对象,是客观存在的万物,有标识.属性和行为.一个人,一台电脑,一辆轿车都是对象 类是创建对象的模板或蓝图,是对象的抽象,是对象的类型. 一个对象是一个类的一个实例,是一个类的变量. ...

  5. Apex语言(五)循环结构

    1.循环结构 循环语句允许我们多次执行一个语句或一组语句(重执行语句).  2.while语句 只要给定条件为真,目标语句就会重复执行. [格式] while (循环条件){ 语句; } [流程图] ...

  6. Django_文件上传

    使用Django框架实现文件上传功能    upload.html <!DOCTYPE html> <html lang="en"> <head> ...

  7. eas之日期选择控件

    初始化打印控件KDPrinter ctrlPrinter = new KDPrinter(); 增加列 // 指定插入位置table.addColumn(index);// 插入到最后table.ad ...

  8. eas之树

    如何设置树的深度(即树总共有几级) // 设置树的深度为3,即树包括0.1.2三级结点 table.getTreeColumn().setDepth(3); 如何设置树的方向 树的方向包括两种:自上向 ...

  9. Modbus串行通信

    一.Modbus通信协议简介 1. Modbus协议 Modbus 是一个请求/应答协议,并且提供功能码规定的服务.Modbu协议是 OSI 模型第 7 层上的应用层报文传输协议. MODBUS协议支 ...

  10. phpstorm zhuce ma

    username :cf96PiPYt271u1TC License Key : 97807-12042010 00001GctOKh8f206hliugiW6iAS5bh 8AAXfEtfpdDSr ...