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 ...
随机推荐
- 牛客网NOIP赛前集训营-提高组(第六场) C-树
题目描述 有一棵有 n 个结点的树,每条边有编号为 0,1,2 的三种颜色,刚开始每条边颜色都为 0 . 现在有 3 种操作: \(1\ x\ y\ col\) ,表示询问 \(x\) 到 \(y\) ...
- hive之视图和索引
一.视图 1.视图定义 视图其实是一个虚表,视图可以允许保存一个查询,并像对待表一样对这个查询进行操作,视图是一个逻辑结构,并不会存储数据. 2.视图的创建 通过创建视图来限制数据访问可以用来保护信息 ...
- delphi 打开和关闭外部exe
一.打开外部exe 1.use文件-SHELLAPI 2.ShellExecute(handle,'open','E:\test.exe','-s','',SW_SHOWNORMAL); 二.关闭外部 ...
- ruby语法之方法
ruby中的方法相当于python的函数 其定义规则为: 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常量,从而导致不正确地解析调用. 方法应在调用之前定义,否则 ...
- Spring---基础配置
1.@Scope 1.1.描述了Spring容器如何新建Bean的实例: 1.2.@Scope(value="") value值有: 1.2.1.singleton 一个Sprin ...
- 输出匹配项:grep
命令格式: grep pattern [file...] When grep encounters a "pattern" in the file, it prints out t ...
- Mac OS 网络设置教程 wifi设置与宽带设置详解
虽然所有设备连接无线网络的步骤都相差无几,但是Mac与windows系统还是不相同的,那么,苹果Mac怎么连接无线网络呢?针对此问题,本文就为大家介绍Mac网络的设置教程,有兴趣的朋友们可以了解下.如 ...
- leetcode-167周赛-1293-网格中的最短路径
题目描述: 自己的提交:广度优先 O(mn*min(k,m+n)) class Solution: def shortestPath(self, grid, k: int) -> int: vi ...
- boost circularBuffer
1. circular buffer has two fundamental properties: (1): The capacity of the circular buffer is const ...
- 【JVM】吞吐量与延迟关系
堆内存增大,gc一次能处理的数量变大,吞吐量大:但是gc一次的时间会变长,导致后面排队的线程等待时间变长: 向反,如果堆内存小,gc一次时间短,排队等待的线程等待时间变短,延迟减少,但一次请求的数量变 ...