文档章节

设计模式之代理模式

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
杭州
程序员
私信 提问

暂无文章

rabbitmq学习

使用docker安装rabbit docker run -d --hostname my-rabbit --name rabbit -p 8080:15672 rabbitmq:management--hostname:指定容器主机名称--name:指定容器名称-p:将mq端口号映射到本地...

元谷
18分钟前
0
0
想知道谁是你的最佳用户?基于Redis实现排行榜周期榜与最近N期榜

本文由云+社区发表 前言 业务已基于Redis实现了一个高可用的排行榜服务,长期以来相安无事。有一天,产品说:我要一个按周排名的排行榜,以反映本周内用户的活跃情况。于是周榜(按周重置更新...

腾讯云加社区
21分钟前
1
0
函数计算性能福利篇(二) —— 业务冷启动优化

继前一篇《函数计算性能福利篇——系统冷启动优化》,我们再来看看近期函数计算推出的 Initializer 功能之后,带来的一波高能性能优化成果。 背景 函数计算是一个事件驱动的全托管 serverle...

阿里云官方博客
26分钟前
1
0
开源版本说明

1527
28分钟前
2
0
Mysql经验-------持续更新

单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。 说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

DoLo-lty
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部