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

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

类图:

#include<iostream>
#include<string>
using namespace std;
class Item {
public:
Item(string kind,bool fact) {
this->kind = kind;
this->fact = fact;
}
//物品类别
string kind;
//是否真伪?
bool fact;
};
/*
   抽象一种购物方式,具有买功能。
 */
class Shopping {
public:
virtual void buy(Item &item) = ;
};
/*
   基于抽象类,实现一种具体的购物模式,去韩国购物
 */
class KoreaShopping : public Shopping {
public:
virtual void buy(Item &item) {
cout<<"去韩国进行了购物,买了"<<item.kind<<endl;
}
};
/*
   基于抽象类,实现⼀一种具体的购物模式,去美国购物
 */
class USAShopping : public Shopping {
public:
virtual void buy(Item &item) {
cout << "去美国进行了购物,买了"<< item.kind << endl;
}
};
/*
   基于抽象类,实现一种具体的购物模式,去非洲购物
 */
class AfrikaShopping : public Shopping{
public:
virtual void buy(Item &item) {
cout << "去非洲进行了购物,买了" << item.kind << endl;
}
};
/*
   有一个海外代购代理,同样实现了购物模式,
   而且增加了办理护照和货物海关安检等具体业务。
 */
class OverseasProxy :public Shopping {
public:
OverseasProxy(Shopping* shopping) {
this->shopMode = shopping;
}
~OverseasProxy() {
delete this->shopMode;
}
//调用真实购物模式  
virtual void buy(Item &item) {
if (distinguish(item) == true) {
this->shopMode->buy(item);
check(item);
}
else {
cout << "发现[" << item.kind << "],不能购买" << endl;
}
}
//辨别物品真伪
bool distinguish(Item &item) {
cout << "对物品[" << item.kind << "]辨别真伪." << endl;
return item.fact;
}
//海关安检
void check(Item &item) {
cout << "通过海关安检,带回国内" << endl;
}
private:
Shopping * shopMode;
};
int main(void)
{
//  有几种类型的物品
Item t1("化妆品", true);
Item t2("飞机", true);
Item t3("狮子", false);
Shopping *shopping = NULL;
OverseasProxy *proxy = NULL;
//现在想要买这几种物品
//1.  去韩国买化妆品
proxy = new OverseasProxy(new KoreaShopping);
proxy->buy(t1);
delete proxy;
//2. 去美国买飞机
proxy = new OverseasProxy(new USAShopping);
proxy->buy(t2);
delete proxy;
//3  去非洲买狮子 
proxy = new OverseasProxy(new AfrikaShopping);
proxy->buy(t3);
delete proxy;
return ;
}

运行结果:

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. C/C++ cJSON 使用实例

    本文为转载 原文地址:http://blog.sina.com.cn/s/blog_4c0cb1c00102xg7j.html 使用说明:将cJSON.c.cJSON.h两个文件,拷贝到工程项目文件中 ...

  2. 11.IPFS搭建及上传获取数据——2019年12月12日

    title: ipfs使用 date: "2019-09-26 10:17:16" tags: ipfs categories: 技术驿站 1.mac安装ipfs--使用npm工具 ...

  3. 调试web worker (动态生成的worker)

    1.在worker.js源码文件中 写下debugger关键词 2. F12打开控制台,重新刷新页面,加载worker.js文件(注意之前的缓存,chrome推荐使用 ctrl + F5 刷新) 3. ...

  4. boost bimap

    The library Boost.Bimap is based on Boost.MultiIndex and provides a container that can be used immed ...

  5. JS中数据结构之栈

    1.栈的基本介绍 栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现. 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种后入先出( ...

  6. 用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件

    用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件用C#编写ActiveX控件 开发浏览器控件这是本控件开发完成后的一个简单应用.我们可以利用它以本地文件夹为单位来批量更新服务器的 ...

  7. Windows 08 R2_组策略

    目录 目录 组策略 组策略对象GPO 实验一组策略的计算机配置 实验二组策略的用户配置 实验三首选设置 实验四组策略更改计算机桌面 常用的组策略管理模块策略 限制用户运行指定的Windows程序 隐藏 ...

  8. JarvisOJ 逆向Writeup

    1. 爬楼梯 先运行apk,查看具体的功能 爬一层楼是可以点击的,爬到了,看FLAG是不可以点击的.我们可以大致的了解到到了具体的楼层才可以看到flag,多次打开软件,楼层数目是随机的. 用APKID ...

  9. drf:restful概念,类继承关系,drf请求封装,drf请求流程,版本控制组件,认证组件(token),权限组件

    1.restful规范 resfful规范的概念最重要: 是一套规范,规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的就是,以前写增删改查的时候需要些四个视图寒素,rest ...

  10. 安装SSH2拓展 PHP上传文件到远程服务器

    情景:客户端上传图片到服务器A,服务器A同步上传至另外一个静态资源服务器B 环境:php7 linux(ubuntu) 安装php的ssh2扩展 -dev sudo apt-get install p ...