设计模式--代理模式C++实现
代理模式C++实现
1定义
为其他对象提供一种代理以控制对这个对象的访问
2类图

角色定义:
Subject抽象主体角色,抽象类或者接口,是一个普通的业务类型定义
RealSubject具体主体角色,也叫作被委托角色,被代理角色。业务逻辑的具体执行者
Proxy代理主体角色,委托类,代理类。
3实现
class Subject
{
public:
virtual ~Subject()=0;
virtual void Request()=0;//具体代理的任务
protected:
Subject();
};
class ConcreteSubject:public Subject
{
public:
ConcreteSubject();
~ConcreteSubject();
void Request();
};
class Proxy:public Subject
{
public:
Proxy();
Proxy(Subject* _sub);
void Request()//实现对委托者的委托任务执行与补偿
{
bef();
this->_sub->Request();
end();
}
void bef()
{}
void end()
{}
~Proxy();
private:
Subject* _sub;
};
注:由此可看出,代理模式最大的好处便是逻辑与实现的彻底解耦
3应用
①优点
职责清晰(实现好内部结构就可以,具体客户要求由代理进行分化)
高扩展性(具体主题角色随时变化,只要他实现了接口,无论如何都逃不出代理的手掌,所以代理无论如何都是可以使用的)
智能化()
②使用场景
eg打官司找律师,游戏代练。。。目的就是为了减轻自己的负担。具体参见Spring AOP,这是个典型的代理模式
4扩展
①普通代理
用户设置代理ip地址,确保用户知道代理的存在。调用者只需要知道代理存在就好,而不用知道代理了谁。对真实角色的构造,调用进行项目组约定
②强制代理
调用者直接调用真实角色,而不关心代理是否存在,其代理的产生有真实角色决定。
——强制要求,你必须通过真实角色查找到代理角色,否则不能访问
实现方案:
在真实角色中定义自己的代理者。每个流程的执行都首先判断是否有代理存在,否则提示无法访问
在代理角色中,代理的代理返回this;
5 代理的升级
①过滤,拦截等功能。
eg游戏代理增加计费功能。
需要增加接口Iproxy,实现功能的增加

6动态代理
定义:
实现阶段不用关心代理谁,而在运行阶段指定代理哪一个对象。AOP(Aspect Oriented Programming)面向横切面编程。核心就是动态代理。
其实其核心就是这个动态问题的解决了,利用C++中的多态,回调等方案,我们就可以实现。
类图

实现
动态代理类
class GamePlayH:public InvocationHandler
{
public:
GamePlayH(object _obj)
{
this->obj = _obj;
}
//核心方法,通过接收被代理实例,其方法,参数。对其进行代理调用
//相关问题由客户端传入
object invoke(object proxy,Method method,object[]args)
{
object result = method.invoke(this.obj,args);
return result;
}
private:
object _obj; //被代理的实例
};
改进:增加一个具体检测功能
object invoke(object proxy,Method method,object[]args)
{
object result = method.invoke(this.obj,args);
if(obj.当前状态)
{cout << " 状态错误..."<<endl;}
return result;
}
AOP编程,面向横切面编程。
没有使用新技术,但是对于我们的设计,编码都有非常大的影响,对日志,事物,权限等问题,在系统设计时都不用考虑,而在设计后通过AOP方式切过去。

解释:两条独立发展的路线。动态代理实现代理的职责,业务逻辑Subject实现相关的逻辑功能,两者之间没有必然的相互耦合的关系。通知从另一个切面切入,最终在高层模块也就是Client耦合,完成逻辑的封装任务。
实现
class Subject
{
public:
virtual void DoSomething(string str) = 0;
};
//真实主题
class RealSubject :public Subject
{
void DoSomething(string str)
{
cout << "Do Something" << str << endl;
}
};
//动态代理的Handler类
class MyInvocationHandler :public InvocationHandler
{
private:
object target = NULL;
public:
MyInvocationHandler(object _obj)
{
target = _obj;
}
//代理方法
object invoke(object proxy,Method method,object[]args)
{
return method.invoke(target,args);
}
};
//动态代理类......关键
template<class T>
class DynamicProxy
{
public:
static T newProxyInstance(ClassLoader loader, Class Instance,InvocationHandler h)
{
//找到JoinPoint连接点,AOP框架使用元数据定义
if(true)
{
//执行一个前置通知
(new BeforeAdvice()).exec();
}
return (T)Proxy.newProxyInstance(loader,interface,h);
}
};
注:类中插入了AOP术语,eg 在什么连接点执行什么操作。这是一个简单的横切面编程。
class IAdvice
{
public:
void exec();
}
class BeforeAdvice:public IAdvice
{
public:
void exec()
{
cout << "this is BeforeAdvice,I am Running"<<endl;
}
};
//场景类
class Client
{
public:
//主题定义
Subject sub = new RealSubject();
//Handler定义
InvocationHandler handler = new MyInvocationHandler(sub);
//定义主题的代理
Subject proxy= DynamicProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(),handler);
//代理的行为
proxy.DoSomething();
}
设计模式--代理模式C++实现的更多相关文章
- 9. 星际争霸之php设计模式--代理模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C++设计模式——代理模式
前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...
- PHP设计模式-代理模式
概念理解: 代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子. 参与者: client(参与者) ...
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- 浅谈Python设计模式 - 代理模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...
- Java 之 设计模式——代理模式
设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...
- [Head First设计模式]抢票中的设计模式——代理模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 代理模式
用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构
- Java设计模式 - 代理模式
1.什么是代理模式: 为另一个对象提供一个替身或占位符以访问这个对象. 2.代理模式有什么好处: (1)延迟加载 当你需要从网络上面查看一张很大的图片时,你可以使用代理模式先查看它的缩略图看是否是自己 ...
- 深入浅出设计模式——代理模式(Proxy Pattern)
模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...
随机推荐
- lnmp的环境的安装和搭建
上次中,记录了lamp的环境的搭建和安装,这一次说一下lnmp环境的安装和搭建,下面是详细的安装步骤: 一. 先是Mysql的安装步骤,其实和上次的一样: ): 编译安装MySQL +-------- ...
- 《你的SSD可以用100年,你造吗?》总结
来自 http://www.ssdfans.com/?p=1778 上图是闪存的一个基本存储单元,由一种类NMOS的双层浮空栅 (Floating Gate) MOS管组成,用以存储一个bit(SLC ...
- 配置支持Basler的API函数的开发环境
第一步:文件说明 使用默认路径安装Basler pylon x86 4.2.1.4845.exe 以后生产的文件如下: 文件说明: apps为用于配置ip和调试相机的软件 bin为驱动程序 CLPro ...
- DataGird 相关
DataGird控件 DataGirdView 控件 DataGird类 他们之间是什么关系??????? DataGridView 控件是替换 DataGrid 控件的新控 ...
- Selenium2.0 Webdriver 随笔
Webdriver can't action the element when the element is out of view 1. Scroll to the element use Java ...
- java实现FTP下载文件
ftp上传下载文件,是遵照ftp协议上传下载文件的,本例仅以下载文件为例. 重要的方法解释: 1.FTP功能相关依赖路径:org.apache.commons.net.ftp.*: 2.ftp默认端口 ...
- struts.xml 配置文件的主要元素
1.package元素 作用: 在struts2的配置文件中引入了面向对象思想.分包管理,易于管理动作类,便于模块化开发动作类. 属性: name:包的名称.名称唯一. extends:一般情况下需要 ...
- Spring-1-E Game(HDU 5011)解题报告及测试数据
Game Time Limit:1000MS Memory Limit:65536KB Description Here is a game for two players. The rule ...
- dependency的scope
scope作用域,一共有三种作用域:compile(编译).runtime(运行).test(测试) 备注:打包必经compile阶段 1.test 测试 2.compile 编译 打 ...
- saltstack之haproxy的安装配置
使用saltstack编译安装haproxy: 由于编译安装haproxy,所以安装之前需要建立编译环境,将编译环境需要安装的包单独放置在一个目录中,当编译haproxy或其他时,直接include这 ...