文档章节

设计模式之代理模式

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

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

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

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

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

  结构图

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

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

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

         

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

         

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

         

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

         

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

         

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

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

         

         

 

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

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

 

  适用场景

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

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

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

© 著作权归作者所有

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

暂无文章

机器学习管理平台 MLFlow

最近工作很忙,博客一直都没有更新。抽时间给大家介绍一下Databrick开源的机器学习管理平台-MLFlow。 谈起Databrick,相信即使是不熟悉机器学习和大数据的工程湿们也都有所了解,它由Spark的...

naughty
今天
0
0
idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
13
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
2
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
1
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部