代理模式简介:

客户端通过代理对象来访问实际的服务对象。代理控制着客户端对服务对象的访问,可以在发送请求给服务对象的前后进行自定义处理。代理类和服务类应都实现自同一个接口,这样既可以在不改变客户端和服务器端代码的情况下增加新的代理类,同时对客户端来说不必关心访问的到底是服务器还是代理。

代理模式适合的部分应用场景(即代理模式的类型):

1. 保护代理

实现访问控制功能,如果希望只有拥有权限的客户对象才可以使用服务对象,就可以使用此模式。比如访问系统的操作日志,客户对象为普通用户,通过代理对象进行操作,代理判断权限不足不提供服务。当然访问控制也可以在服务端进行实现,如果服务端是不开放源代码的第三方库,那么就可以要代理模式。

2. 远程代理

适用于服务对象在远程服务器上的情况,代理通过网络传递客户请求,对客户端屏蔽一系列复杂的操作(例如请求封包解包、数据解析等)。对客户端来说和调用本地服务对象的过程相同。

3. 日志记录代理

适用于当需要保存对于服务对象的请求历史记录时。 代理可以在向服务传递请求前进行记录。

4. 虚拟代理

如果有一个偶尔使用的重量级服务对象, 一直保持该对象运行会消耗系统资源时, 可使用代理模式。无需在程序启动时就创建该对象, 可将对象的初始化延迟到真正有需要的时候。

代理模式的优点

1. 可以在客户端毫无察觉的情况下控制服务对象

2. 可以对服务对象的生命周期进行管理(如果客户端对服务对象的声明周期没有特殊要求)

3. 代理可以在服务对象还未创建的时候就开始工作

4. 可以在不对服务类或客户端类做出修改的情况下创建新的代理类

代理模式的缺点:

1. 服务响应可能会出现延迟

2. 代码可能会变得稍微复杂一些,因为要多创建一些类

保护代理的示例代码:

#include <iostream>using namespace std;//公共接口
class IServer
{
public:virtual void doWork()=0;
};//服务类
class RealServer :public IServer
{
public:void doWork() { cout << "real_server work." << endl; }
};//代理类
class Proxy :public IServer
{
public:Proxy(RealServer* server) :_server(new RealServer(*server)){    }bool checkAccess() const {cout << "check access.\n";return true;}void doWork() { /*服务对象调用之前的控制操作,例如访问控制*/if (checkAccess()) {/* 委托给服务对象 */_server->doWork();}}
private:RealServer*_server;
};//客户端调用代码
void clientInvoke(IServer* server)
{server->doWork();
}int main()
{RealServer* real_server = new RealServer();clientInvoke(real_server);Proxy* proxy = new Proxy(real_server);clientInvoke(proxy);
}

结构型模式--Proxy代理模式相关推荐

  1. java-设计模式(结构型)-【代理模式】

    1.代理模式(ProxyMode) 定义:外观模式是对类与类之间关系的描述,而代理模式是对原来的方法添加其他的操作. 代理有"网关"的含义,比如用户访问论坛,则要经过代理(网关)授 ...

  2. Java设计模式(四):结构性模式(适配器模式、桥接模式、装饰模式、组合模式、外观模式、亨元模式、代理模式)

    目录 一· 适配器设计模式 1.1 现实生活中的适配器例子 1.2 基本介绍 1.3 工作原理 1.4 类适配器模式 1.5 对象适配器模式 1.6 接口适配器模式 1.7 适配器模式在 Spring ...

  3. 设计模式之结构型模式:适配器模式、桥接模式、组合模式、装饰器模式、代理模式、

    文章目录 什么是结构型模式 适配模式 适配器的数据结构 适配器的实现 缺省适配器 适配器优缺点 适配器模式的使用环境 桥接模式 桥接模式数据结构 桥接模式的实现 桥接模式和适配器模式的联用 桥接模式的 ...

  4. 结构型模式之代理模式

    结构型模式之代理模式 代理模式 结构 静态代理 动态代理 动态代理和静态代理的区别 优缺点 使用场景 源代码 代理模式 一个对象A需要给某个对象B提供一个代理以控制对对象A的访问.这个时候访问对象C不 ...

  5. Java设计模式之结构型:享元模式

    一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...

  6. Java设计模式之结构型:装饰器模式

    一.什么是装饰器模式: 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能, ...

  7. 结构型设计模式之组合模式

    结构型设计模式之组合模式 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创 ...

  8. 面试官:策略模式和代理模式有什么区别?

    大家好,我是田哥,昨天一哥们面试被问到代理模式,刚好,我也正在写<MyBatis源码分析:小白系列>专栏中的代理模式. 这里也说明一下,本文是MyBatis源码分析专栏中的一篇文章. 感兴 ...

  9. 【设计模式】——装饰器模式VS代理模式

    最近在学习Spring源码,尤其是在学习FactoryBean的时候,有涉及到装饰器模式,再结合自己之前学习的设计模式,代理模式觉得和装饰器模式很相似,但是仔细研究后有各有不同,在这篇文章中整理下,希 ...

最新文章

  1. es分布式结构原理是什么?
  2. EDAS ScheduleX 问题
  3. ASP.NET MVC编程——视图
  4. MS932和Shift-JIS的差异
  5. Seafile - 最好的 Dropbox 开源替代,面向团队而设计
  6. C# 实现一个基于值相等性比较的字典
  7. 数据导入时遭遇 ORA-01187 ORA-01110
  8. java多线程(2)----继承的方式创建多线程
  9. mysql命令行操作语句_MySQL常用命令行操作语句
  10. iOS 数据归档解档
  11. 微信分享功能(weixin-js-sdk)
  12. 714. 买卖股票的最佳时机含手续费
  13. pandas window中涉及的offset是什么意思
  14. uni-app在手机上背景图片不显示
  15. 通过 WebRTC 共享屏幕很容易
  16. 哪些IC设计公司会在CMMB竞争中突围?
  17. 迅雷和小米这对好基友,究竟在密谋什么?
  18. 【手把手带你Godot游戏开发】FlappyBird:5.1 无尽水管子滚滚来(一)
  19. 00后专访:我是如何初中毕业年仅16岁便踏入北漂码农行业的(一)
  20. 使用requests库豆瓣电影爬虫

热门文章

  1. 【机器学习-学习笔记】吴恩达老师机器学习课的笔记(黄海广博士)
  2. 【WSN通信】能量均衡的无线传感器网络非均匀分簇路由协议附matlab代码
  3. 基于CAN的网络管理NM(network management)
  4. 给大家介绍一款校园网盘软件,孜创校园网盘软件,搭建学校私有云存储
  5. Java String,看这篇就够了
  6. 中山川田是一家什么样的企业
  7. 办公室计算机网络时断时续,网卡运行不正常网络时断时续的解决方法
  8. 中专计算机基础期末考试题,职业中专第一学期计算机应用基础WIN7和Word2010版期末考试题.doc...
  9. 【Gem5】有关gem5模拟器的资料导航
  10. 单细胞拟时分析:基因及通路随拟时表达变化趋势