设计模式---接口隔离模式之代理模式(Proxy)
一:概念
代理模式(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.定义 代理模式:代理模式是为一个对象提供一个代用品或占位符,以便控 ...
随机推荐
- bzoj 1264: [AHOI2006]基因匹配Match (树状数组优化dp)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1264 思路: n大小为20000*5,而一般的dp求最长公共子序列复杂度是 n*n的,所以我 ...
- 爬虫_糗事百科(scrapy)
糗事百科scrapy爬虫笔记 1.response是一个'scrapy.http.response.html.HtmlResponse'对象,可以执行xpath,css语法来提取数据 2.提取出来的数 ...
- Python的快排应有的样子
快排算法 简单来说就是定一个位置然后,然后把比它小的数放左边,比他大的数放右边,这显然是一个递归的定义,根据这个思路很容易可以写出快排的代码 快排是我学ACM路上第一个让我记住的代码,印象很深 ...
- cf245H Queries for Number of Palindromes (manacher+dp)
首先马拉车一遍(或者用hash),再做个前缀和处理出f[i][j]表示以j为右端点,左端点在[i,j]的回文串个数 然后设ans[i][j]是[i,j]之间的回文串个数,那就有ans[i][j]=an ...
- NOIP2015斗地主(搜索+模拟+贪心)
%%%Luan 题面就不说了,和斗地主一样,给一组牌,求最少打几次. 注意一点,数据随机,这样我们瞎搞一搞就可以过,虽然直接贪心可以证明是错的. 枚举方法,每次搜索按照(三顺子>二顺子>普 ...
- 【php】php分隔字符串为数组
工作中会经常分隔字符串为数组,我们可以用php内置函数str_split(),可是有时候字符串中包含中文,切割后会乱码,比如 print_r(str_split('dw氛围fesf',3)); 输出 ...
- centos7安装mha4mysql
mysql搭建mha需要用的两个rpm包.(manager包和node包) 下载地址:https://download.csdn.net/download/dajdajdajdaj/10603389 ...
- 使用Disruptor实现生产者和消费者模型
生产者 package cn.lonecloud.procum.disruptor; import cn.lonecloud.procum.Data; import com.lmax.disrupto ...
- ie烦人的bug篇
好多公司都不支持ie6了,基本都是ie8+,就连jq新版本也宣布放弃低版本ie,就不用说那些框架了,不过想用兼容ie的angularjs可以用我司徒大神写的avalon,个人感觉avalon也是比较好 ...
- js jquery select 操作 获取值,选中选项,增加,修改,删除
select示例: <select id="sel"> <option value="1">one</option> < ...