代理模式

尽管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. Arduino ULN2009驱动步进电机

    一.实物图 二.例子代码 注:代码来自老外 http://www.4tronix.co.uk/arduino/Stepper-Motors.php 功能:控制电机正反转 // This Arduino ...

  2. JSP_内置对象_请求转发和请求重定向的区别

    请求重定向:客户端行为,response.sendRedirect(),从本质上将等同与两次请求,前一次请求request对象不会保存,地址栏的URL地址会改变. 请求转发:服务器行为,request ...

  3. windows 下安装mysql 成功版

    mysql 下载地址 http://dev.mysql.com/downloads/ zip版下载 解压到本地 假设文件保存在C:\mysql-5.7.17-winx64 1.以管理员身份运行cmd. ...

  4. 另一个维度:cocos-2d VS vue

    最近再看cocos-2d的东西,期间得到了同事和老板的支持,在此感谢.之前一直在做vue网页,现在看游戏cocos-2d这块,刚接触肯定有点不适应.cocos-2d多了很多感念:导演.场景.节点等.这 ...

  5. Package和Activity

    Package Package 包.只是在我们的app中这个Package是唯一的,就像你身份证号码一样.在我们做app自动化时,我们就需要知道他的Package,我们知道了Package那么也就知道 ...

  6. 阿里云服务器centos7环境下安装xampp后,mysql有进程,但是却没有监听3306端口

    配置阿里云服务器centos7中xampp环境时出现了一种情况: 在centos中可以使用命令进入mysql 修改后也可以远程用phpmyadmin连接mysql 但是用navicat却无法连接 先修 ...

  7. jsp页面获取服务器Ip地址等数据

    废话不多说,直接上代码 <%@ page language="java" import="java.util.*" pageEncoding=" ...

  8. .net 单元测试

    都说测试驱动开发,但是想写好单元测试其实不容易,不是因为测试用例难以构造,而是因为很多时候方法非常复杂 其中部分测试想要完成就十分费力,其中让人崩溃的地方主要如下: 实例私有函数 实例静态私有函数 十 ...

  9. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机、状压DP)

    手动博客搬家: 本文发表于20181217 23:54:35, 原地址https://blog.csdn.net/suncongbo/article/details/85058680 人生第一道后缀自 ...

  10. 手动编译java的package问题,及演示继承的基本实现

    不用IDE,而直接用命令编译JAVA包,仔细看了下,作一个记录. 以下的URL值得收藏. http://www.aiuxian.com/article/p-2115485.html http://ww ...