Java设计模式(八)Proxy代理模式
一、场景描述
代理在生活中并不少见,租房子需要找中介,打官司需要找律师,很多事情我们需要找专业人士代理我们做,另一方面,中介和律师也代理了房东、法律程序与我们打交道。
当然,设计模式中的代理与广义的代理还是有所差别的;A对象调用B对象提供的服务X时,使用代理模式的前提是B对象实现了IB接口,通过接口IB公布其可被代理的方法;好比铁路总公司有N多服务,其售票服务可被第三方售票商家代理,其订餐服务可被另外一些第三方商家代理,第三方商家要代理铁总的服务的前提是铁总开放这些服务;在设计模式实现中则体现为,如果B对象有A、B、C三方法,其中A、B方法面向某类服务,则定义接口IB1,C方法实现另一类服务,则定义接口IB2,在此情况下,才可以由B1Proxy、B2Proxy来代理C的IB1、IB2服务。
广义上的代理可以在B对象不通过接口公开其服务的情况下实现代理,设计模式中的代理模式则要求其实现接口,因此,我们在设计类时,良好的规范是将该类中的各种方法封装为不同的接口去实现。

上图为信息管理系统中报表工具类的设计图示,报表工具类提供报表的生成服务,生成后报表文件存储到服务器磁盘上。
代理类持有源服务类,其公布的方法实现了源服务类的方法(即生成报告),并扩展其功能,实现将报告存储到FTP上。
由此可见,代理类可用于扩展源类方法,此外也可隐藏源类方法,例如生成报表时需要设置报表的输出格式,则代理类可在调用源类生成报告方法前,先调用setExportFormat()方法来设置输出文件格式。
总之,如果我们有类B,在调用其处理一些问题时,可以使用B1、B2等代理类,为类B的方法提供更多的功能。
二、示例代码
服务接口:
package lims.designpatterndemo.proxydemo;
public interface IReport {
public String generateReport();
}
服务类:
package lims.designpatterndemo.proxydemo;
public class Report implements IReport {
public String generateReport(){
return "Report path in Server Disk.";
}
}
代理类:
package lims.designpatterndemo.proxydemo;
public class ReportProxy implements IReport{
private Report report;
public ReportProxy(){
super();
//创建代理类时,创建源类
this.report = new Report();
}
public String generateReport(){
//执行源类功能
String reportFSPath = report.generateReport();
//执行代理类功能
String reportFTPPath = saveReport2Ftp(reportFSPath);
return reportFTPPath;
}
public String saveReport2Ftp(String reportFSPath){
return "Report in FTP Server.";
}
}
调用类:
package lims.designpatterndemo.proxydemo;
public class ProxyDemo {
public static void main(String[] args){
IReport report = new Report();
String reportPath= report.generateReport();
System.out.println(reportPath);
//
report = new ReportProxy();
reportPath = report.generateReport();
System.out.println(reportPath);
}
}
源功能调用输出:
Report path in Server Disk.
代理功能调用输出:
Report in FTP Server.
Java设计模式(八)Proxy代理模式的更多相关文章
- java设计模式之Proxy(代理模式)
java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...
- Java设计模式:Proxy(代理)模式
概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...
- Java设计模式之《代理模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...
- Java设计模式学习记录-代理模式
代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...
- 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...
- php设计模式之Proxy(代理模式)和Facade(外观)设计模式
Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对 ...
- 【java设计模式】-13代理模式
代理模式(Proxy Pattern) 定义: 给某一个对象提供一个代理,并由代理对象控制对原对象的引用.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到 ...
- java常用设计模式八:代理模式
一.概述 代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象. 其特征是代理类与委托类有同样的接口,真正的核心业务逻辑还是在实际对象里面. 二.为什么要使用代理模式 当 ...
- 《JAVA设计模式》之代理模式(Proxy)
在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结 ...
- java设计模式-----11、代理模式
Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问. 所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代 ...
随机推荐
- 发个2012年用java写的一个控制台小游戏
时间是把杀狗刀 突然发现了12年用java写的控制台玩的一个文字游戏,有兴趣的可以下载试试哈汪~ 里面难点当时确实遇到过,在计算倒计时的时候用了多线程,当时还写了好久才搞定.很怀念那个时间虽然不会做游 ...
- svn从Windows服务器上迁移到Linux上
svn从Windows服务器迁移到Linux服务器 author:headsen chen 2017-10-16 16:50:32 个人原创,转载请注明.否则依法追究法律责任 ...
- 爬虫-request以及beautisoup模块笔记
requests模块 pip3 install requests res = requests.get('') res.text res.cookies.get_dict() res.content ...
- 项目中用到的node-express模块
反向代理中间件: var proxyMiddleWare = require("http-proxy-middleware"); var proxyPath = "htt ...
- canvas动画气球
canvas小球的动画我用canvas画布实现的小球动画效果,可以参考下 我用canvas画布实现的小球动画效果,可以参考下 我用canvas画布实现的小球动画效果,可以参考下 我用canvas画布实 ...
- [SDOI2010] 魔法猪学院
Description 给定e和边权,求有多少条不同的道路能从1到n使得边权之和的和小于e Solution A*裸题 娘的要是SPFA再把dis写成to就剁手 // By YoungNeal #in ...
- 设计模式 --> (14)中介者模式
中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者模式的例子很多,大到联合国安理会,小到房屋中介,都扮演了 ...
- cocos对lua代码加密
1.0 cocos luacompile 用法 我用的普通的cocos2d lua,没用quick,quick好像可以对整个资源包括图像和音频都加密,打包成zip.但我没用quick.看了下luaco ...
- 听翁恺老师mooc笔记(13)--类型定义和联合
typedef 虽然我们知道使用struct这个关键字定义一个结构类型,然后可以使用该结构类型定义变量.但是每次要使用的时候都需要带着struct这个关键字,那么如何摆脱这个关键字哪?C语言提供了一个 ...
- 每日冲刺报告——Day5(Java-Team)
第五天报告(11.6 周一) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://git ...