一:概念

代理模式(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)的更多相关文章

  1. 结构型模式(七) 代理模式(Proxy)

    一.动机(Motivate) 在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者.或者系统结构带来很多麻烦.如何在不 ...

  2. C#设计模式学习笔记:(12)代理模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7814004.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第七个模式,也是 ...

  3. Java进阶篇设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  4. 【java设计模式】(3)---代理模式(案例解析)

    设计模式之代理模式 一.概述 1.什么是代理模式? 解释第一遍:代理模式主要由三个元素共同构成: 1)一个接口,接口中的方法是要真正去实现的. 2)被代理类,实现上述接口,这是真正去执行接口中方法的类 ...

  5. Java设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  6. 设计模式之第16章-代理模式(Java实现)

    设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...

  7. java设计模式(一)动态代理模式,JDK与CGLIB分析

    -本想着这个知识点放到Spring Aop说说可能更合适一点,但因为上一篇有所提到就简单分析下,不足之处请多多评论留言,相互学习,有所提高才是关键! 什么是代理模式: 记得有本24种设计模式的书讲到代 ...

  8. 【趣味设计模式系列】之【代理模式3--Cglib动态代理源码解析】

    1. 图解 上图主要描述了Cglib动态代理的主要执行过程,下面做详细分析,以下源码使用的Cglib版本为3.2.12. 2. Enhancer源码分析 public Object create() ...

  9. 菜鸟版JAVA设计模式—从买房子看代理模式

    今天学习了代理模式. 相对于适配器模式,或者说装饰器模式,代理模式理解起来更加简单. 代理这个词应该比較好理解,取代去做就是代理. 比方,我们买卖房子,那么我们会找中介,我要卖房子,可是我们没有时间去 ...

  10. 《JavaScript设计模式与开发实践》-- 代理模式

    详情个人博客:https://shengchangwei.github.io/js-shejimoshi-daili/ 代理模式 1.定义 代理模式:代理模式是为一个对象提供一个代用品或占位符,以便控 ...

随机推荐

  1. puppet一个完整的实例

    一个具体实例来简单说明puppet的具体结构 创建第一个配置 puppet的组成清单这主要包含这几个部分 资源,文件,模板,节点,类,定义 puppet中有个模块的定义,这个比较重要,基本是puppe ...

  2. Codeforces Round #470 Div. 1

    A:暴力枚举x2的因子,由此暴力枚举x1,显然此时减去其最大质因子并+1即为最小x0. #include<iostream> #include<cstdio> #include ...

  3. [洛谷P2627] 修剪草坪

    传送门:>Here< 题意:不能有连续超过$k$个奶牛的一段,求最大的和 思路分析 Dp还是容易看出来的. 我的第一感觉是一维,$f[i]$表示前i头奶牛的最大效率.其实这也是可以解的,具 ...

  4. hdu 2191 (多重背包二进制优化)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 实现代码: #include<bits/stdc++.h> using namespac ...

  5. bzoj 3626 : [LNOI2014]LCA (树链剖分+线段树)

    Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q ...

  6. Linux block(1k) block(4k) 换算 gb

    输入 df  显示1k blocks  大小   再输入  df -h  显示 gb换算大小  结论 block(1k) 计算公式为:  block(1k)   /1024/1000  = xx gb ...

  7. 【agc030f】Permutation and Minimum(动态规划)

    [agc030f]Permutation and Minimum(动态规划) 题面 atcoder 给定一个长度为\(2n\)的残缺的排列\(A\),定义\(b_i=min\{A_{2i-1},A_{ ...

  8. windows10配置virtualenv

    1.从官网下载pip:https://pypi.python.org/pypi/pip/,下载完成之后,解压到一个文件夹,用CMD控制台进入解压目录,输入:python setup.py instal ...

  9. 牛客练习赛31 D神器大师泰兹瑞与威穆

    双链表搞完了 #include<bits/stdc++.h> using namespace std; #define maxn 1000005 int tot,bac[maxn],fa[ ...

  10. spring代码异常捕获到logback logging.config=logback-spring.xml文件中不能输出异常e.printStackTrace

    在spring中使用logging.config=logback-spring.xml将日志转存到了文件中.但是代码中的捕获的异常无法用 e.printStackTrace 打印到文件中.使用如下方法 ...