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 ...
随机推荐
- CS184.1X 计算机图形学导论(第五讲)
一.观察:正交投影 1.特性:保持平行线在投影后仍然是平行的 2.一个长方体,对处在只有深度不同的位置上的同一物体来说,它的大小不会改变. 3.透视投影:平行线在远处会相交(例如铁轨) 4.glOrt ...
- java生成快递单并调用打印机打印
生成快递单过程中需要生成条形码,生成条形码可参考:https://www.cnblogs.com/linbky/p/12091248.html 下面这段代码生成的快递单是完全符合京东快递的10 x 1 ...
- boost heap
1. using boost::heap::priority_queue #include <boost/heap/priority_queue.hpp> #include <ios ...
- ps示例
博客PS示例 一显示指定真正用户名(RUID)或用户ID的进程 打开另外一个终端 [root@centos72 ~]# id wang uid=1000(wang) gid=1000(wang) gr ...
- DELPHI FMX IOS模拟器调试时出现No SDKs could be found
解决办法: 在OSX里打开XCODE,点击XCODE菜单->Perferences->Locations在Commond Line Tools选择XCODE
- php str_split()函数 语法
php str_split()函数 语法 str_split()函数怎么用 php str_split()函数用于把字符串分割到数组中,语法是str_split(string,length),将字符串 ...
- Security基础(三):OpenSSL及证书服务、邮件TLS/SSL加密通信
一.OpenSSL及证书服务 目标: 本案例要求熟悉OpenSSL工具的基本使用,完成以下任务操作: 使用OpenSSL加密/解密文件 搭建企业自有的CA服务器,为颁发数字证书提供基础环境 方案: 使 ...
- Flutter 中的基本路由
Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航,并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.pop ...
- 8051 r0-r7 是什么
R0~R7表示当前选中的寄存器组的寄存器0~7,5I机有p0,p1,p2,p3口,每组有八个寄存器(R0-R7),比如MOV A Rn (n=0~7),表示把寄存器Rn 的内容送给累加器A,其中源操作 ...
- CSS-inline-block 间隙
间隙产生的原因是`inline-block`对外是`inline`,对内是`block`.`inline`会将连续的空白符解析为一个空格(如:下面示例的两个`li`之间的后面的换行空格).取消间隙的方 ...