一:概念

代理模式(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. 第四十一天 socker server和 event

    今日内容 1.基于TCP的socketserver 2.基于UDP的socketserver 3.event 一.TCP的socketserver #服务器 import socketserver f ...

  2. 读取CSV到DataTable

    using System; using System.Collections.Generic; using System.Data; using System.Data.OleDb; using Sy ...

  3. Tomcat控制台总是打印日志问题的解决办法

    问题 使用gradle启动项目,在tomcat控制台中不停地打印perf4j性能日志,导致开发过程很卡很慢.明明修改了logback.xml配置文件,让它输出到log文件中,而不是控制台,但是不起作用 ...

  4. #SQL1242错误

    --------------------- 子查询更新数据时遇到多条数据时,可以使用SUM&MIN等函数解决:如下: //正确的方法一对多 UPDATE `yd_draw_prize_orde ...

  5. 【HDU - 4349】Xiao Ming's Hope

    BUPT2017 wintertraining(15) #8H 题意 求组合数C(n,i),i从0到n,里面有几个奇数. 题解 直接打表的话可能就直接发现规律了. 规律是n的二进制里有几个1,答案就是 ...

  6. CF868F Yet Another Minimization Problem 分治决策单调性优化DP

    题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...

  7. 【agc013d】Piling Up(动态规划)

    [agc013d]Piling Up(动态规划) 题面 atcoder 洛谷 有\(n\)个球,颜色为黑白中的一种,初始时颜色任意. 进行\(m\)次操作,每次操作都是先拿出一个求,再放进黑白各一个, ...

  8. 【BZOJ5315】[JSOI2018]防御网络(动态规划,仙人掌)

    [BZOJ5315][JSOI2018]防御网络(动态规划,仙人掌) 题面 BZOJ 洛谷 题解 显然图是仙人掌. 题目给了斯坦纳树就肯定不是斯坦纳树了,,,, 总不可能真让你\(2^n\)枚举点集再 ...

  9. 【linux】Linux系统SELinux简介

    安全加强型Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统. 是linux安全加强的另一种实现方式. ...

  10. String:字符串常量池

    String:字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字 ...