代理,说白了就是中介。假设有俩对象A和B,A想访问B,但是根据迪米特法则,我们不能喝陌生人说话,简而言之就是A要减少知道B的相关情况,要降低A与B的耦合度。这时我们使用中介C,而C拥有B的相关情况,A通过C来访问B。

下面我们使用一个案例来说明代理模式:

类图:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Item {
  5. public:
  6. Item(string kind,bool fact) {
  7. this->kind = kind;
  8. this->fact = fact;
  9. }
  10. //物品类别
  11. string kind;
  12. //是否真伪?
  13. bool fact;
  14. };
  15. /*
  16.    抽象一种购物方式,具有买功能。
  17.  */
  18. class Shopping {
  19. public:
  20. virtual void buy(Item &item) = ;
  21. };
  22. /*
  23.    基于抽象类,实现一种具体的购物模式,去韩国购物
  24.  */
  25. class KoreaShopping : public Shopping {
  26. public:
  27. virtual void buy(Item &item) {
  28. cout<<"去韩国进行了购物,买了"<<item.kind<<endl;
  29. }
  30. };
  31. /*
  32.    基于抽象类,实现⼀一种具体的购物模式,去美国购物
  33.  */
  34. class USAShopping : public Shopping {
  35. public:
  36. virtual void buy(Item &item) {
  37. cout << "去美国进行了购物,买了"<< item.kind << endl;
  38. }
  39. };
  40. /*
  41.    基于抽象类,实现一种具体的购物模式,去非洲购物
  42.  */
  43. class AfrikaShopping : public Shopping{
  44. public:
  45. virtual void buy(Item &item) {
  46. cout << "去非洲进行了购物,买了" << item.kind << endl;
  47. }
  48. };
  49. /*
  50.    有一个海外代购代理,同样实现了购物模式,
  51.    而且增加了办理护照和货物海关安检等具体业务。
  52.  */
  53. class OverseasProxy :public Shopping {
  54. public:
  55. OverseasProxy(Shopping* shopping) {
  56. this->shopMode = shopping;
  57. }
  58. ~OverseasProxy() {
  59. delete this->shopMode;
  60. }
  61. //调用真实购物模式  
  62. virtual void buy(Item &item) {
  63. if (distinguish(item) == true) {
  64. this->shopMode->buy(item);
  65. check(item);
  66. }
  67. else {
  68. cout << "发现[" << item.kind << "],不能购买" << endl;
  69. }
  70. }
  71. //辨别物品真伪
  72. bool distinguish(Item &item) {
  73. cout << "对物品[" << item.kind << "]辨别真伪." << endl;
  74. return item.fact;
  75. }
  76. //海关安检
  77. void check(Item &item) {
  78. cout << "通过海关安检,带回国内" << endl;
  79. }
  80. private:
  81. Shopping * shopMode;
  82. };
  83. int main(void)
  84. {
  85. //  有几种类型的物品
  86. Item t1("化妆品", true);
  87. Item t2("飞机", true);
  88. Item t3("狮子", false);
  89. Shopping *shopping = NULL;
  90. OverseasProxy *proxy = NULL;
  91. //现在想要买这几种物品
  92. //1.  去韩国买化妆品
  93. proxy = new OverseasProxy(new KoreaShopping);
  94. proxy->buy(t1);
  95. delete proxy;
  96. //2. 去美国买飞机
  97. proxy = new OverseasProxy(new USAShopping);
  98. proxy->buy(t2);
  99. delete proxy;
  100. //3  去非洲买狮子 
  101. proxy = new OverseasProxy(new AfrikaShopping);
  102. proxy->buy(t3);
  103. delete proxy;
  104. return ;
  105. }

运行结果:

PROXY——代理模式的更多相关文章

  1. C++设计模式-Proxy代理模式

    Proxy代理模式 作用:为其他对象提供一种代理以控制对这个对象的访问. 代理的种类: 如果按照使用目的来划分,代理有以下几种: 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代 ...

  2. php设计模式之Proxy(代理模式)和Facade(外观)设计模式

    Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对 ...

  3. Proxy 代理模式

    简介 代理模式是用一个简单的对象来代替一个复杂的或者创建耗时的对象. java.lang.reflect.Proxy RMI 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对 ...

  4. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  5. Proxy 代理模式 动态代理 cglib MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. 设计模式12: Proxy 代理模式(结构型模式)

    Proxy 代理模式(结构型模式) 直接与间接 人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活.满足特定需求的解决方案.如下图,开始时,A需要和B进行3次通信, ...

  7. php设计模式 Proxy (代理模式)

    代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务.而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行 ...

  8. 设计模式(十三): Proxy代理模式 -- 结构型模式

      设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路 ...

  9. 设计模式C++学习笔记之二(Proxy代理模式)

      代理,一看名字就知道这只是个中介而已,真实的执行者在代理的后面呢.cbf4life在他的书里提的例子也很有趣,更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com.现在贴 ...

  10. 设计模式——proxy代理模式

    目录 概述 定义 角色 为什么会有代理模式? 应用场景 示例 静态代理 例子 动态代理 JDK中生成代理对象的API 代码示例: 代码示例2 Cglib代理 代码示例 AOP(AspectOrient ...

随机推荐

  1. 洛谷P1446/BZOJ1004 Cards Burnside引理+01背包

    题意:有n张牌,有R+G+B=n的3种颜色及其数量,要求用这三种颜色去染n张牌.n张牌有m中洗牌方式,问在不同洗牌方式下本质相同的染色方案数. 解法:这道题非常有意思,题解参考Hzwer学长的.我这里 ...

  2. elasticsearch相关聚合查询示例

    索引(index):logstash-nginx-*,type:nginx_access 请求路径: 1.按照某个字段进行分组统计访问量 { "query": { "bo ...

  3. hadoop集群常见问题解决

    1:namenode启动 datanode未启动 解决: /hadoop/tmp/dfs/name/current VERSION 查看截取id 与 data/current VERSION集群ID ...

  4. [BZOJ3669] [NOI2004] 魔法森林 LCT维护最小生成树

    题面 一开始看到这道题虽然知道是跟LCT维护最小生成树相关的但是没有可以的去想. 感觉可以先二分一下总的精灵数,但是感觉不太好做. 又感觉可以只二分一种精灵,用最小生成树算另一种精灵,但是和似乎不单调 ...

  5. Hadoop的基础命令

    首次使用Hadoop时,格式化文件系统命令:hdfs namenode -format 启动HDFS:start-dfs.sh 启动YARN:start-all.sh start-all.sh等价于s ...

  6. sql 2008查看进程情况和对应语句,检查死锁进程

    ---------------------------------进程情况1----------------------- --得到SPID if object_id('tempdb..#info') ...

  7. 【Elasticsearch】清空指定index/type下的数据

    1.postman请求接口 http://ip:端口/index/type/_delete_by_query?conflicts=proceed body为: { "query": ...

  8. Sumdiv

    题目链接 题意:求a^b的所有约数之和mod9901. 思路:因为一个数A能够表示成多个素数的幂相乘的形式.即A=(a1^n1)*(a2^n2)*(a3^n3)...(am^nm).所以这个题就是要求 ...

  9. GIT安装包备用地址

    如果官网下载被禁止,可在下面这个地址下载,速度飞快 http://www.wmzhe.com/soft-38801.html#download

  10. AtCoder Grand Contest 012 A - AtCoder Group Contest(贪心)

    Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement There are 3N participa ...