一:概念
代理模式(Proxy Pattern)就是为其他对象提供一种代理以控制对这个对象的访问。 比如: 智能指针 为别人做嫁衣
所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。
二:动机
在面向对象系统中,有些对象由于某种原因(比如对象创建开销很大或者某些操作需要安全控制或者需要进程外访问等),直接访问会给使用者、或者系统结构带来很多的麻烦。
如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方法。
三:模式定义
为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。
--《设计模式》Gof
四:类图(结构)
五:代码讲解
(一)原代码
class ISubject{ //接口
public:
virtual void process();
}; class RealSubject: public ISubject{ //继承接口实现
public:
virtual void process(){
//....
}
}; class ClientApp{ ISubject* subject; public: ClientApp(){
subject=new RealSubject(); //这里是不合适的,可能由于性能原因,安全控制,系统分步等,压根无法获取到实例
} void DoTask(){
//...
subject->process(); //....
}
};
(二)代理版本
class ISubject{
public:
virtual void process();
}; //Proxy的设计
class SubjectProxy: public ISubject{ public:
virtual void process(){
//对RealSubject的一种间接访问,很多操作和方案
//....
}
}; class ClientApp{ ISubject* subject; public: ClientApp(){
subject=new SubjectProxy();
} void DoTask(){
//...
subject->process(); //....
}
};
六:要点总结
(一)“增加一层间接层”是软件系统中对许多复杂问题的一种常见解决方案。在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的Proxy对象便是解决这一问题的常用手段。
(二)具体Proxy设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象做细粒度的控制,如copy-on-write技术,有些可能对组建模块提供抽象代理层,在架构层次对对象做proxy
(三)proxy并不一定要求保持接口完整的一致性,只要能够实现间接控制,有时候损及一些透明性是可以接受的。
七:案例实现:理论实现
#include <iostream>
#include <string>
using namespace std; //定义接口
class Interface
{
public:
virtual void Request(string pass="") = ;
virtual ~Interface(){}
}; //真实类,但是由于安全控制无法直接访问
class RealClass :public Interface
{
public:
virtual void Request(string pass)
{
if (strcmp(pass.c_str(),""))
{
cout << "can't visit" << endl;
}
else
{
cout << "really request" << endl;
}
}
};
//代理类,内部含有密码,可以通过安全控制
class ProxyClass :public Interface
{
private:
RealClass* m_realclass;
public:
virtual void Request(string pass="")
{
m_realclass = new RealClass();
m_realclass->Request("");
delete m_realclass;
}
};
//客户端
class Client
{
private:
Interface* interfS; //直接访问
Interface* interfP; //代理访问
public:
Client()
{
interfP = new ProxyClass();
interfS = new RealClass();
} void VisitRealObjByProxy()
{
interfP->Request();
} void VisitRealObj()
{
interfS->Request();
} ~Client()
{
delete interfP;
delete interfS;
}
};
void main()
{
Client *c = new Client();
c->VisitRealObjByProxy();
c->VisitRealObj(); system("pause");
return;
}
八:案例实现:书籍代理
#include <iostream>
#include <string>
using namespace std; //定义接口
class Interface
{
public:
virtual void SaleBook() = ;
virtual ~Interface(){}
};
//实体店
class RealClass :public Interface
{
public:
virtual void SaleBook()
{
cout << "store shopping" << endl;
}
};
//代理类
class ProxyTaoBao :public Interface
{
private:
RealClass* m_realclass; void Double()
{
cout << "discount" << endl;
}
public:
virtual void SaleBook() //代理类在传递真实数据前进行某些处理
{
m_realclass = new RealClass();
Double();
m_realclass->SaleBook();
delete m_realclass;
}
};
void main()
{
ProxyTaoBao* ptb = new ProxyTaoBao();
ptb->SaleBook(); system("pause");
return;
}
设计模式---接口隔离模式之代理模式(Proxy)的更多相关文章
-
结构型模式(七) 代理模式(Proxy)
一.动机(Motivate) 在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者.或者系统结构带来很多麻烦.如何在不 ...
-
C#设计模式学习笔记:(12)代理模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7814004.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第七个模式,也是 ...
-
Java进阶篇设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
-
【java设计模式】(3)---代理模式(案例解析)
设计模式之代理模式 一.概述 1.什么是代理模式? 解释第一遍:代理模式主要由三个元素共同构成: 1)一个接口,接口中的方法是要真正去实现的. 2)被代理类,实现上述接口,这是真正去执行接口中方法的类 ...
-
Java设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
-
设计模式之第16章-代理模式(Java实现)
设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...
-
java设计模式(一)动态代理模式,JDK与CGLIB分析
-本想着这个知识点放到Spring Aop说说可能更合适一点,但因为上一篇有所提到就简单分析下,不足之处请多多评论留言,相互学习,有所提高才是关键! 什么是代理模式: 记得有本24种设计模式的书讲到代 ...
-
【趣味设计模式系列】之【代理模式3--Cglib动态代理源码解析】
1. 图解 上图主要描述了Cglib动态代理的主要执行过程,下面做详细分析,以下源码使用的Cglib版本为3.2.12. 2. Enhancer源码分析 public Object create() ...
-
菜鸟版JAVA设计模式—从买房子看代理模式
今天学习了代理模式. 相对于适配器模式,或者说装饰器模式,代理模式理解起来更加简单. 代理这个词应该比較好理解,取代去做就是代理. 比方,我们买卖房子,那么我们会找中介,我要卖房子,可是我们没有时间去 ...
-
《JavaScript设计模式与开发实践》-- 代理模式
详情个人博客:https://shengchangwei.github.io/js-shejimoshi-daili/ 代理模式 1.定义 代理模式:代理模式是为一个对象提供一个代用品或占位符,以便控 ...
随机推荐
-
人工智能交互集成在线语音合成能力的Tips
在线语音合成就是在联网的场景下将文字转换成声音,实现机器向人的声音交互.这个概念应该是比较好理解的,下面就结合官网的Android在线合成的Demo讲解一下合成的流程以及大家经常遇到的一些问题. 到官 ...
-
关于 SSV-ID: 4474 POC的分析和思考
SSV-ID: 4474 SSV-AppDir: Discuz!漏洞 发布时间: 2008-11-21 (GMT+0800) URL:http://sebug.net/vuldb/ssvid-4474 ...
-
codevs 3732 解方程
神题不可言会. f(x+p)=f(x)(mod p) #include<iostream> #include<cstdio> #include<cstring> # ...
-
c:翻转一个长句中的每个单词
问题: 输入:“how are you baby-- " 输出:”woh era uoy --ybab " #include<stdio. ...
-
android脚步---使用framelayout实现霓虹灯效果
轮换帧布局中7个TextView的背景颜色,会出现上面颜色渐变不断变换. 首先在main.xml文件中进行布局 总体布局为framelayout 中间有7个Textview,代表7种不同的颜色,可以看 ...
-
python基础(6):列表和字典类型
前面我们所接触的数据类型都是存单个值,今天我们来看看可以存多个值的列表和字典. 预习: 1.有列表data=['alex',49,[1900,3,18]],分别取出列表中的名字,年龄,出生的年,月,日 ...
-
如何使用借助python完成 ARCGIS工具箱的调用
上个月使用python调用arcgis工具箱完成了火点txt文件转shp文件的小功能, 感觉很不错, 写下这篇博客希望对大家有所帮助. 1.环境介绍: 系统: win8.1(64位) arcgis:d ...
-
java多线程之yield,join,wait,sleep的区别
Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...
-
Daily Sentence(英语每日一句)
1.When you want to give up, remember why you started. 当你想要放弃的时候,请记住当初你为何而开始. 2.It does not do to dwe ...
-
Centos7下安装mysql5.6需要注意的点
1.自带的Mariadb和mysql冲突需要卸载. 2.原先安装过的mysql没有卸载干净会导致安装失败. 3.mysql文件夹权限需要给够,my.cnf也是一样. 4.安装过程中如果出现的其他问题很 ...