一:概念

代理模式(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. python 项目启动路径自动添加

    import os import sys base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  #找到当前项目 ...

  2. Hdoj 1856.More is better 题解

    Problem Description Mr Wang wants some boys to help him with a project. Because the project is rathe ...

  3. Hdoj 1232.畅通工程 题解

    Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通 ...

  4. Hdoj 2289.Cup 题解

    Problem Description The WHU ACM Team has a big cup, with which every member drinks water. Now, we kn ...

  5. 【CF908G】New Year and Original Order(动态规划)

    [CF908G]New Year and Original Order(动态规划) 题面 洛谷 CF 题解 设\(f[i][j][k][0/1]\)表示当前填到了第\(i\)位,有\(j\)个大于等于 ...

  6. 【BZOJ5287】[HNOI2018]毒瘤(动态规划,容斥)

    [BZOJ5287][HNOI2018]毒瘤(动态规划,容斥) 题面 BZOJ 洛谷 题解 考场上想到的暴力做法是容斥: 因为\(m-n\le 10\),所以最多会多出来\(11\)条非树边. 如果就 ...

  7. cf1073D Berland Fair (二分答案+树状数组)

    用一个树状数组维护前缀和,每次我二分地找一个位置,使得我能一路买过去 但这个买不了 那以后肯定也都买不了了,就把它改成0,再从头二分地找下一个位置,直到这一圈我可以跑下来 然后就看跑这一圈要花多少钱. ...

  8. Gym - 100989F

    You must have heard about Agent Mahone! Dr. Ibrahim hired him to catch the cheaters in the Algorithm ...

  9. 跟我一起学习vue2(熟悉vue.js)[一]

    由于有angularjs的基础,所以我第一步是在官网:https://cn.vuejs.org/ 上面看了三遍他的理论知识,还有实例. 现在做完了第二步,就是在菜鸟教程:http://www.runo ...

  10. Python之常用模块--collections模块

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...