代理模式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++实现的更多相关文章

  1. 9. 星际争霸之php设计模式--代理模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. C++设计模式——代理模式

    前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...

  3. PHP设计模式-代理模式

    概念理解: 代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子. 参与者: client(参与者) ...

  4. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  5. 浅谈Python设计模式 - 代理模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...

  6. Java 之 设计模式——代理模式

    设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...

  7. [Head First设计模式]抢票中的设计模式——代理模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  8. JAVA 设计模式 代理模式

    用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构

  9. Java设计模式 - 代理模式

    1.什么是代理模式: 为另一个对象提供一个替身或占位符以访问这个对象. 2.代理模式有什么好处: (1)延迟加载 当你需要从网络上面查看一张很大的图片时,你可以使用代理模式先查看它的缩略图看是否是自己 ...

  10. 深入浅出设计模式——代理模式(Proxy Pattern)

    模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...

随机推荐

  1. Mac打开应用提示已损坏的解决办法

    相信很多升级了最新Mac系统的用户在打开一些应用的时候都会出现“应用XX已损坏”的系统提示,安装这些应用的时候总是提示“已损坏,移至废纸篓”这类信息,根本无法打开应用. Mac打开应用提示已损坏的解决 ...

  2. 如何设计Spring读取某种文件的逻辑顺序

    1. 判断系统属性System.getProperty("apdb.config.path", "");,有的话,优先使用.(系统属性可以在命令行中以 -D&l ...

  3. IOS自动化定位方式

    原文地址http://blog.csdn.net/wuyepiaoxue789/article/details/77885136 元素属性的介绍 type:元素类型,与className作用一致,如: ...

  4. 取得选中Grid的数据

    var MergeAction = new Ext.Action({ text: '合并(选中两行)', handler: function () { if (grid.getSelectionMod ...

  5. ACM-ICPC 2018 南京赛区网络预赛 - L Magical Girl Haze (分层迪杰斯特拉)

    题意:N个点,M条带权有向边,求可以免费K条边权值的情况下,从点1到点N的最短路. 分析:K<=10,用dist[i][j]表示从源点出发到点i,免费j条边的最小花费.在迪杰斯特拉的dfs过程中 ...

  6. Spring-2-A Magic Grid(SPOJ AMR11A)解题报告及测试数据

    Magic Grid Time Limit:336MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Tha ...

  7. OpenCV KNN 之 使用方法

    http://blog.csdn.net/WL2002200/article/details/43149229 OpenCV 中KNN构造函数如下. C++: CvKNearest::CvKNeare ...

  8. 设置oracle编辑的快捷方式

    打开PLSQL Developer: 中文版:[工具]-->[首选项]-->[用户界面]-->[编辑器],在右侧界面往下拉找到[自动替换],点击[编辑],就可以自定义想要的快捷方式了 ...

  9. Java线程状态流转---线程

    说明:线程共包括以下5种状态.1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runn ...

  10. 手动加载B120i/B320i阵列卡驱动安装RHEL7.0

    实验设备: Micro server Gen8(B120i) DL360e Gen8(B320i) 目录 一.前期准备... 1 二.加载阵列卡驱动... 11 三.手动分区... 21 四.安装设置 ...