代理模式(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. ...
随机推荐
- Ceph 文件系统的安装
yum install -y wget wget https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#md5=01026f87 ...
- CF1168B Good Triple 性质分析_好题
题意翻译 给出01串s,求数对[l,r]个数,使得能找到至少一对[x,k],使1<=x,k<=|s|且l<=x<x+2k<=r且s[x]=s[x+k]=s[x+2k] 题 ...
- PAT_A1153#Decode Registration Card of PAT
Source: PAT A1153 Decode Registration Card of PAT (25 分) Description: A registration card number of ...
- 移动端 配置rem
<script> function Rem() { var docEl = document.documentElement, oSize = docEl.clientWidth / 7. ...
- C语言开发框架、printf(day02)
C语言里包含以.c作为扩展名的文件,这种 文件叫源文件.C语言程序的绝大部分内容 应该记录在源文件里. C语言里还包括以.h作为扩展名的文件,这种 文件叫头文件. C语言程序里可以直接使用数字和加减乘 ...
- 操作符重载(day07)
二十 操作符重载 eg:复数x+yi +4i (+2i) + (+4i) = +6i 双目操作符(L # R) 1.1 运算类的双目操作符:+ - * / -->左右操作数可以是左值也可以是右值 ...
- BZOJ 3514 GERALD07加强版 (LCT+主席树)
题目大意:给定n个点m条边无向图,每次询问求当图中有编号为[L,R]的边时,整个图的联通块个数,强制在线 神题!(发现好久以前的题解没有写完诶) 我们要求图中联通块的个数,似乎不可搞啊. 联通块个数= ...
- [luogu2414 NOI2011]阿狸的打字机 (AC自动机)
传送门 Solution 我们知道AC自动机上如果有一点A的fail[A]->B那么B为A的一个后缀 那么我们的问题\((x,y)\)就变为在y中有多少个点直接或间接连向x的终止节点 如果写暴力 ...
- (30)导入时如何定制spring-boot依赖项的版本【转载】【从零开始学Spring Boot】
此文章转载地址:http://www.tuicool.com/articles/RJJvMj3 请注重作者的版权. spring-boot通过maven的依赖管理为我们写好了很多依赖项及其版本,我们可 ...
- oracle 单独开始一个事物的写法 。
SET TRANSACTION NAME 'Update salaries'; SAVEPOINT before_salary_update; UPDATE employees SET salary= ...