一、场景描述

代理在生活中并不少见,租房子需要找中介,打官司需要找律师,很多事情我们需要找专业人士代理我们做,另一方面,中介和律师也代理了房东、法律程序与我们打交道。

当然,设计模式中的代理与广义的代理还是有所差别的;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代理模式的更多相关文章

  1. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  2. Java设计模式:Proxy(代理)模式

    概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...

  3. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  4. Java设计模式学习记录-代理模式

    代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...

  5. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...

  6. php设计模式之Proxy(代理模式)和Facade(外观)设计模式

    Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对 ...

  7. 【java设计模式】-13代理模式

    代理模式(Proxy Pattern) 定义: 给某一个对象提供一个代理,并由代理对象控制对原对象的引用.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到 ...

  8. java常用设计模式八:代理模式

    一.概述 代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象. 其特征是代理类与委托类有同样的接口,真正的核心业务逻辑还是在实际对象里面. 二.为什么要使用代理模式 当 ...

  9. 《JAVA设计模式》之代理模式(Proxy)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结 ...

  10. java设计模式-----11、代理模式

    Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问. 所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代 ...

随机推荐

  1. JVM内存越多,能创建的线程越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。

    一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse ...

  2. Mecanim之IK动画

    序言:IK动画全名是Inverse Kinematics 意思是逆向动力学,就是子骨骼节点带动父骨骼节点运动. 比如体操运动员,只靠手来带动身体各个部位的移动.手就是子骨骼,身体就是它的父骨骼,这时运 ...

  3. windows下安装Virtualenvwrapper

    windows下安装Virtualenvwrapper 我们可以使用Virtualenvwrapper来方便地管理python虚拟环境,但是在windows上安装的时候.....直接 install  ...

  4. 研华ADAM 4000系列型号枚举值

    public enum Adam4000Type    {        Non = 0,        Adam4011 = 4011,        Adam4012 = 4012,        ...

  5. java 二叉树排序

    1 class BinaryTree{ 2 class Node{ 3 private Comparable data; 4 private Node left; 5 private Node rig ...

  6. android中shape属性大全

    出处:http://kofi1122.blog.51cto.com/2815761/521605

  7. 光环国际联合阿里云推出“AI智客计划”

    2018阿里巴巴云栖大会深圳峰会3月28日.29日在大中华喜来登酒店举行,阿里云全面展示智能城市.智能汽车.智能生活.智能制造等产业创新. 3月28日下午,以"深化产教融合,科技赋能育人才& ...

  8. werkzeug(flask)中的local,localstack,localproxy探究

    1.关于local python中有threading local处理方式,在多线程环境中将变量按照线程id区分 由于协程在Python web中广泛使用,所以threading local不再满足需 ...

  9. 1.由浅入深解析 SimpleDateFormat

    一.SimpleDateFormat简介 SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (date -> text).语法分析 (text - ...

  10. Struts存取数据

    ValueStack举例分析: Action存 Jsp页面取,用于数据展示 存数据三种方式总结 存数据->map 或 root 展示数据->Strusts标签   这个玩意用着很舒服,能让 ...