代理模式(Proxy)C++实现
代理模式
尽管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++实现的更多相关文章
- 代理模式/proxy模式/结构型模式
代理模式proxy 定义 为其他对象提供一种代理,并以控制对这个对象的访问.最简单的理解,买东西都是要去商店的,不会去工厂. java实现三要素 proxy(代理)+subject(接口)+realS ...
- 代理模式(Proxy pattern)
代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...
- 13.代理模式(Proxy Pattern)
using System; namespace Test { //抽象角色:声明真实对象和代理对象的共同接口. //代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象, //同时代理 ...
- 大熊君说说JS与设计模式之------代理模式Proxy
一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...
- 【转】设计模式(十一)代理模式Proxy(结构型)
设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ...
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
- 代理模式 PROXY Surrogate 结构型 设计模式(十四)
代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...
- 二十四种设计模式:代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...
- 设计模式——代理模式(Proxy Pattern)
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...
- 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释
代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...
随机推荐
- Arduino ULN2009驱动步进电机
一.实物图 二.例子代码 注:代码来自老外 http://www.4tronix.co.uk/arduino/Stepper-Motors.php 功能:控制电机正反转 // This Arduino ...
- JSP_内置对象_请求转发和请求重定向的区别
请求重定向:客户端行为,response.sendRedirect(),从本质上将等同与两次请求,前一次请求request对象不会保存,地址栏的URL地址会改变. 请求转发:服务器行为,request ...
- windows 下安装mysql 成功版
mysql 下载地址 http://dev.mysql.com/downloads/ zip版下载 解压到本地 假设文件保存在C:\mysql-5.7.17-winx64 1.以管理员身份运行cmd. ...
- 另一个维度:cocos-2d VS vue
最近再看cocos-2d的东西,期间得到了同事和老板的支持,在此感谢.之前一直在做vue网页,现在看游戏cocos-2d这块,刚接触肯定有点不适应.cocos-2d多了很多感念:导演.场景.节点等.这 ...
- Package和Activity
Package Package 包.只是在我们的app中这个Package是唯一的,就像你身份证号码一样.在我们做app自动化时,我们就需要知道他的Package,我们知道了Package那么也就知道 ...
- 阿里云服务器centos7环境下安装xampp后,mysql有进程,但是却没有监听3306端口
配置阿里云服务器centos7中xampp环境时出现了一种情况: 在centos中可以使用命令进入mysql 修改后也可以远程用phpmyadmin连接mysql 但是用navicat却无法连接 先修 ...
- jsp页面获取服务器Ip地址等数据
废话不多说,直接上代码 <%@ page language="java" import="java.util.*" pageEncoding=" ...
- .net 单元测试
都说测试驱动开发,但是想写好单元测试其实不容易,不是因为测试用例难以构造,而是因为很多时候方法非常复杂 其中部分测试想要完成就十分费力,其中让人崩溃的地方主要如下: 实例私有函数 实例静态私有函数 十 ...
- SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机、状压DP)
手动博客搬家: 本文发表于20181217 23:54:35, 原地址https://blog.csdn.net/suncongbo/article/details/85058680 人生第一道后缀自 ...
- 手动编译java的package问题,及演示继承的基本实现
不用IDE,而直接用命令编译JAVA包,仔细看了下,作一个记录. 以下的URL值得收藏. http://www.aiuxian.com/article/p-2115485.html http://ww ...