文档章节

设计模式之代理模式

chenxkang
 chenxkang
发布于 2017/04/27 20:20
字数 857
阅读 2
收藏 0

       代理模式,属于结构型设计模式,它是使用者和对象之间的访问层。

  定义:为其它对象提供一种代理以控制对这个对象的访问。

  问题描述:有些对象由于某些原因,如对象的创建开销很大或者一些安全控制,直接访问会给系统增加没必要的负担。

  解决方案:在使用者和对象之间增加一个代理类,通过代理类来创建对象以及对此对象的一些访问控制。

  结构图

  举个栗子:讲一个购买火车票的故事。。。

  我们都知道,购买火车票的方式有很多种,直接在火车站购票,可以在代售点购票,也可以在网上购票,代售点和网络都属于代理,三种购票方式的区别为:火车站购票,可以退票,获得的是纸质票;代售点购票,不可以退票,获得的是纸质票;网上购票,可以退票,获得的是电子票。使用代理模式,实现对三种购票方式的权限进行控制,具体实现方式如下:

  1. 新增一个抽象购票类BuyTickets,定义一些具体购票类和购票代理类需要实现的方法。代码如下:

         

  2. 新增一个普通购票类TrainTickets,实现抽象购票类总定义的方法。代码如下:

         

  3. 新增一个购票代理类ProxyBuyTickets,同样实现抽象购票类总定义的方法,以及自己的方法。代码如下:

         

  4. 在使用者类中通过代理类的实例分别实现三种购票方式的功能。代码如下:

         

  5. 运行后的效果,如图所示:

         

  以上是静态代理的实现方式,代理类就是使用者和对象之间的访问层,通过给代理类传入参数来指定所需要的功能,对对象的访问做了一些控制,避免了去创建一些无关的对象,节省了内存。

  动态代理实现比较简单,直接上代码了:

         

         

 

  优点:对实际访问的对象进行控制,并可以添加额外的功能;不同的代理器可以实现不同的功能,提高了系统的可扩展性。

  缺点:需要额外的工作,有些代理模式的实现比较复杂,也可能造成请求的处理速度很慢。

 

  适用场景

  1. 远程代理:使得客户端可以访问远程主机上的对象,远程主机上的对象可能有更良好的性能和处理速度,并且可以向客户隐藏网络细节,有代理对象来处理网络连接和通信工作。

  2. 虚拟代理:对于一些加载时间比较长或者占用系统资源比较多的对象,可以创建虚拟对象来先行处理与客户端的交互,再有虚拟代理转发对应的请求给真实的对象。

  3. 缓冲代理:对于一些操作频繁,而且每次操作消耗比较大的对象可以代用缓冲代理的方式,建立临时的缓冲空间,统一进行批量处理。

© 著作权归作者所有

共有 人打赏支持
chenxkang
粉丝 1
博文 20
码字总数 19128
作品 0
杭州
程序员

暂无文章

ajax 提交返回map集合 获取不到值

后台java代码 @RequestMapping("/cameraList") @ResponseBody public Map<String, Object> cameraListForPage(@RequestParam(defaultValue = "1", value = "page") Integer page......

S三少S
6分钟前
0
0
TypeScrip最污的技术课-技术胖TypeScript图文视频教程

近日Node.js之父瑞安达尔(Ryan Dahl)发布新的开源项目 deno,从官方介绍来看,可以认为它是下一代 Node,使用 rust 语言代替 C++ 重新编写跨平台底层内核驱动,上层仍然使用 V8 引擎,最终...

JamesView
8分钟前
5
0
Es学习笔记

1.过滤排重聚合查询 筛选出某一个聚合值的个数统计。相当于mysql的distinct. 关键字:cardinality "aggs": { "2":{ "cardinality": { "field": "field" } ...

Gmupload
11分钟前
0
0
h5语义化标签

语义化HTML:用最恰当的HTML元素标签做恰当的事情。 优点: 提升可访问性; SEO; 结构清晰,利于维护; 通用容器:div——块级通用容器;span——短语内容无语义容器。 <title></title>:简...

莫西摩西
17分钟前
0
0
修改11g rac中 asm diskstring的发现路径

问题 : 如果我 们asm_disking以前是/dev/oracleasm/disks/* ,并且现在已经有磁盘组再用这个磁盘串了,那么,我们无法直接修改这个发现串为 ORCL:*,修改会报错,提示存在的磁盘无法使用新的...

tututu_jiang
19分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部