Proxy代理模式 :

为其他对象提供一种代理以控制对这个对象的访问。代理类作为桥梁是请求方和执行方的中间者,将请求方和真正的执行方分割开来,也是两者之间调用的协调者。例如执行类也就是被代理类,可以在不考虑各种特殊条件下提供所有的执行方法,请求者也可以不考虑特殊条件提出所有的请求。而在调用和被调用时需要考虑的所有条件,在代理类中完成。

1. 考虑请求方的情况:由各代理处理不同的请求

  1. class Service
  2. {
  3. public:
  4. Service();
  5.  
  6. virtual void serviceLv0() = ;
  7. virtual void serviceLv1() = ;
  8. virtual void serviceLv2() = ;
  9. };
  10.  
  11. class OfferService : public Service
  12. //真正的服务提供者
  13. {
  14. public:
  15. OfferService();
  16.  
  17. void serviceLv0()
  18. {
  19. cout<<"Offer serviceLv0"<<endl;
  20. }
  21. void serviceLv1()
  22. {
  23. cout<<"Offer serviceLv0"<<endl;
  24. }
  25. void serviceLv2()
  26. {
  27. cout<<"Offer serviceLv0"<<endl;
  28. }
  29. };
  30.  
  31. class ProxyOfferServiceLv0 : public Service
  32. //lv0 的服务提供代理
  33. {
  34. public:
  35. ProxyOfferServiceLv0()
  36. {
  37. m_instance = new OfferService();
  38. }
  39.  
  40. void serviceLv0()
  41. {
  42. m_instance->serviceLv0();
  43. }
  44. void serviceLv1()
  45. {
  46. cout<<"No serviceLv0"<<endl;
  47. }
  48. void serviceLv2()
  49. {
  50. cout<<"No serviceLv0"<<endl;
  51. }
  52.  
  53. OfferService* m_instance;
  54. };
  55.  
  56. class ProxyOfferServiceLv2 : public Service
  57. //lv2 的服务提供代理
  58. {
  59. public:
  60. ProxyOfferServiceLv2()
  61. {
  62. m_instance = new OfferService();
  63. }
  64.  
  65. void serviceLv0()
  66. {
  67. m_instance->serviceLv0();
  68. }
  69. void serviceLv1()
  70. {
  71. m_instance->serviceLv1();
  72. }
  73. void serviceLv2()
  74. {
  75. m_instance->serviceLv2();
  76. }
  77.  
  78. OfferService* m_instance;
  79. };

2. 考虑执行方的情况

  1. enum EnumState
  2. {
  3. State_isOK,
  4. State_notOK
  5. };
  6.  
  7. class Service
  8. {
  9. public:
  10. Service();
  11.  
  12. virtual void serviceLv0() = ;
  13. virtual void serviceLv1() = ;
  14. virtual void serviceLv2() = ;
  15.  
  16. int getServiceState()
  17. {
  18. return m_state;
  19. }
  20.  
  21. int m_state; // EnumState
  22. };
  23.  
  24. class OfferService : public Service
  25. //真正的服务提供者
  26. {
  27. public:
  28. OfferService();
  29.  
  30. void serviceLv0()
  31. {
  32. cout<<"Offer serviceLv0"<<endl;
  33. }
  34. void serviceLv1()
  35. {
  36. cout<<"Offer serviceLv0"<<endl;
  37. }
  38. void serviceLv2()
  39. {
  40. cout<<"Offer serviceLv0"<<endl;
  41. }
  42. };
  43.  
  44. class ProxyOfferServiceLv0 : public Service
  45. //lv0 的服务提供代理
  46. {
  47. public:
  48. ProxyOfferServiceLv0()
  49. {
  50. m_instance = new OfferService();
  51. }
  52.  
  53. void serviceLv0()
  54. {
  55. if(m_instance->getServiceState() == State_isOK)
  56. //查看执行方的状态
  57. {
  58. m_instance->serviceLv0();
  59. }
  60. else
  61. {
  62. cout<<"serviceLv0 is noOK"<<endl;
  63. }
  64. }
  65. void serviceLv1()
  66. {
  67. cout<<"No serviceLv0"<<endl;
  68. }
  69. void serviceLv2()
  70. {
  71. cout<<"No serviceLv0"<<endl;
  72. }
  73.  
  74. OfferService* m_instance;
  75. };
  76.  
  77. class ProxyOfferServiceLv2 : public Service
  78. //lv2 的服务提供代理
  79. {
  80. public:
  81. ProxyOfferServiceLv2()
  82. {
  83. m_instance = new OfferService();
  84. }
  85.  
  86. void serviceLv0()
  87. {
  88. if(m_instance->getServiceState() == State_isOK)
  89. //查看执行方的状态
  90. {
  91. m_instance->serviceLv0();
  92. }
  93. else
  94. {
  95. cout<<"serviceLv0 is noOK"<<endl;
  96. }
  97. }
  98. void serviceLv1()
  99. {
  100. if(m_instance->getServiceState() == State_isOK)
  101. //查看执行方的状态
  102. {
  103. m_instance->serviceLv1();
  104. }
  105. else
  106. {
  107. cout<<"serviceLv1 is noOK"<<endl;
  108. }
  109. }
  110. void serviceLv2()
  111. {
  112. if(m_instance->getServiceState() == State_isOK)
  113. //查看执行方的状态
  114. {
  115. m_instance->serviceLv2();
  116. }
  117. else
  118. {
  119. cout<<"serviceLv2 is noOK"<<endl;
  120. }
  121. }
  122.  
  123. OfferService* m_instance;
  124. };

C++模式学习------代理模式的更多相关文章

  1. (@WhiteTaken)设计模式学习——代理模式

    今天学习了一下代理模式,代理模式分为很多种.目前感觉有两种是需要学习一下的. 静态代理模式 动态代理模式 1. 静态代理模式 需要被代理的类,实现一个或者多个接口. 代理类需要实现被代理类的接口,在此 ...

  2. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  3. Java进阶篇设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  4. Java设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  5. 10.JAVA-接口、工厂模式、代理模式、详解

    1.接口定义 接口属于一个特殊的类,这个类里面只能有抽象方法和全局常量  (该概念在JDK1.8之后被打破,在1.8后接口中还可以定义普通方法和静态方法,在后续章节会详讲) 1.1 接口具有以下几个原 ...

  6. [转载]Java中继承、装饰者模式和代理模式的区别

    [转载]Java中继承.装饰者模式和代理模式的区别 这是我在学Java Web时穿插学习Java设计模式的笔记 我就不转载原文了,直接指路好了: 装饰者模式和继承的区别: https://blog.c ...

  7. axios 两种异步模式,代理模式 和 异步模式

    axios 两种异步模式,代理模式 和 异步模式

  8. 结构型模式(七) 代理模式(Proxy)

    一.动机(Motivate) 在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者.或者系统结构带来很多麻烦.如何在不 ...

  9. swift设计模式学习 - 代理模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 代理模式 代理模式为其他对象提供一种代理以控制对这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用另一个对象 ...

随机推荐

  1. C#/VB.NET与西门子PLC进行ModbusTcp通信

    进入自动化行业半年多了,每天都与机器打交道. 前段时间接手一个任务,需要将我们机台与下站机台进行通讯,我们机台是PC,下站机台为西门子S7-1200. 想想完成这个任务,领导就会对我这个新人刮目相看, ...

  2. 大数据中HBase的Java接口封装

    该文前提为已经搭建好的HBase集群环境,参见 HBase集群搭建与配置 ,本文主要是用Java编写一个Servlet接口,部署在Tomcat服务器上,用于提供http的接口供其他地方调用,接口中集成 ...

  3. aws存储桶s3使用

    关于aws s3的使用说明: aws官方文档地址:https://docs.aws.amazon.com/s3/index.html#lang/zh_cn 创建s3与基础使用: 1.登陆aws控制台- ...

  4. java多线程之述解

    说起线程 就不得不提进程 他们之间的关系很紧密 进程:内存中运行的应用程序 每个进程都有自己的一块内存空间 而线程是进程中的一个执行单元 一个进程中可以有多个线程 多线程的好处就是可以并发操作程序 将 ...

  5. 学习python,第二篇

    注释 #  单行注释 '''   多行注释 '''      或者    """ 多行注释 """ # Author: Itxpl mag ...

  6. k8s环境搭建--基于minik8s方法

    minik8s 安装 关闭selinux.开启ipv6 sudo bash selinux_ipv6.sh 下载kubectl和minikube 下载minikube,因为国外的源被墙了,所以只能用阿 ...

  7. 第七章 用户输入和while循环

    7.1函数input()的工作原理 函数默认输入为字符串string,如果需使用数字,需用int进行类型转换 7.2 while循环 while是根据条件的真假判断是否进入执行 使用标志: 使用bre ...

  8. Codeforces1151E,F | 553Div2 | 瞎讲报告

    传送链接 E. Number of Components 当时思博了..一直在想对于\([1,r]\)的联通块和\([1,l-1]\)的联通块推到\([l,r]\)的联通块...我真的是傻了..这题明 ...

  9. Scrum Meeting 10.28

    今天大部分同学仍停留在学习阶段,进度快的同学已经在配置SQLserver. 成员 今日完成任务 明日计划 所用时间 徐越 配置SQLserver,试用java程序连接数据库 学习servlet,htt ...

  10. 奔跑吧DKY——团队Scrum冲刺阶段-Day 1-领航

    各个成员在 Alpha 阶段认领的任务 修改 序号 修改 具体描述 1 游戏过程 取消原来的跳跃和俯身按钮,保留跳跃的功能,可以触屏滑动来躲避地面障碍物,也可以躲避另一种陷阱障碍物 2 闯关功能 取消 ...