PROXY——代理模式
代理,说白了就是中介。假设有俩对象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——代理模式的更多相关文章
- C++设计模式-Proxy代理模式
Proxy代理模式 作用:为其他对象提供一种代理以控制对这个对象的访问. 代理的种类: 如果按照使用目的来划分,代理有以下几种: 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代 ...
- php设计模式之Proxy(代理模式)和Facade(外观)设计模式
Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对 ...
- Proxy 代理模式
简介 代理模式是用一个简单的对象来代替一个复杂的或者创建耗时的对象. java.lang.reflect.Proxy RMI 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对 ...
- java设计模式之Proxy(代理模式)
java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...
- Proxy 代理模式 动态代理 cglib MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 设计模式12: Proxy 代理模式(结构型模式)
Proxy 代理模式(结构型模式) 直接与间接 人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活.满足特定需求的解决方案.如下图,开始时,A需要和B进行3次通信, ...
- php设计模式 Proxy (代理模式)
代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务.而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行 ...
- 设计模式(十三): Proxy代理模式 -- 结构型模式
设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路 ...
- 设计模式C++学习笔记之二(Proxy代理模式)
代理,一看名字就知道这只是个中介而已,真实的执行者在代理的后面呢.cbf4life在他的书里提的例子也很有趣,更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com.现在贴 ...
- 设计模式——proxy代理模式
目录 概述 定义 角色 为什么会有代理模式? 应用场景 示例 静态代理 例子 动态代理 JDK中生成代理对象的API 代码示例: 代码示例2 Cglib代理 代码示例 AOP(AspectOrient ...
随机推荐
- 笔记--NS_SWIFT_NAME与@objc区别与用途
swift中使用Selector经常要在方法前面添加@objc,除了默认的@objc,其实我们还可以添加自己制定的swift中调用的函数名 @objc(pushToControllerName:par ...
- 查看linux服务器的版本信息
查看linux系统信息 uname -a Linux localhost.localdomain 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UT ...
- MongoDB的日志系统
mongodb中主要有四种日志.分别是系统日志.Journal日志.oplog主从日志.慢查询日志等.这些 日志记录着Mongodb数据库不同方便的踪迹.下面分别介绍这四种日志: 1.系统日志 系统日 ...
- boost compressedPair
boost::compressed_pair behaves like std::pair. However, if one or both template parameters are empty ...
- 提高wifi速度的设置办法
系列的提高wifi速度的设置办法 在DNS一栏有你们家的地址,在你们家的地址前输入“114.114.114.114”并以“,”结尾(注意:要用英文输入法哦.) 设置完后点击左上角的“无线局域网”回到初 ...
- DELPHI 10 SEATTLE 在OSX上安装PASERVER
旧版本的DELPHI在安装目录下里的PASERVER目录有安装文件,但奇怪在这个SEATTLE上的PASERVER目录下只有一个EXE程序的安装程序,显然不能安装到OSX里,需要在Embarcad ...
- mybatis框架之装饰模式
学习开源框架源码,除了储备点知识以便于与面试官互相忽略之外,我想最重要的还是去学习大神如何写代码,如何做到职责单一,如何做到可扩展等... 本篇,试着总结一下mybatis在缓存模块使用到的装饰模式. ...
- 1,MySQL常用函数
一,MySQL聚合函数 1,AVG()函数 AVG()函数是一个聚合函数,它用于计算一组值或表达式的平均值. AVG()函数的语法如下: AVG(DISTINCT expression) 例如有如下p ...
- 移动端与pc端的区别 及 ios的 兼容性问题
前言:这里移动端主要指 hybrid app 中的H5页面.app 中对页面 样式和功能 的需求会更精细一点. 1.适配: 手机端的尺寸多样,3.5英寸的 iPhone4应该是最小的,只要考虑 兼容到 ...
- Spring JDK动态代理
1. 创建项目在 MyEclipse 中创建一个名称为 springDemo03 的 Web 项目,将 Spring 支持和依赖的 JAR 包复制到 Web 项目的 WEB-INF/lib 目录中,并 ...