前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java设计模式(八)Proxy代理模式

Java设计模式(八)Proxy代理模式

作者头像
用户1637609
发布2018-04-12 15:45:03
7510
发布2018-04-12 15:45:03
举报
文章被收录于专栏:马洪彪马洪彪

一、场景描述

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

当然,设计模式中的代理与广义的代理还是有所差别的;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的方法提供更多的功能。

二、示例代码

服务接口:

代码语言:javascript
复制
package lims.designpatterndemo.proxydemo;

public interface IReport {
    public String generateReport();
}

服务类:

代码语言:javascript
复制
package lims.designpatterndemo.proxydemo;

public class Report implements IReport {
    public String generateReport(){
        return "Report path in Server Disk.";
    }
}

代理类:

代码语言:javascript
复制
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.";
    }
}

调用类:

代码语言:javascript
复制
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.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、场景描述
  • 二、示例代码
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档