首页 > 编程语言 >Java设计模式之代理模式

Java设计模式之代理模式

时间:2023-11-24 13:30:47浏览次数:28  
标签:Java 对象 代理 filename 原始 RealImage 设计模式 display

在某些情况下,我们希望通过一个中间代理来控制对某个对象的访问,这可能是因为原始对象的创建或访问涉及复杂的逻辑,或者我们想要在访问原始对象之前或之后执行一些操作

代理模式提供了一个代理对象,它充当了原始的对象的替代品,以控制对原始对象的访问。代理对象与原始对象实现相同的接口,使得客户端可以无缝的切换和使用。代理对象可以对客户端的请求进行拦截,修改或增强,然后将请求传递给原始对象。

代理模式的应用可以带来多种效果:

  • 远程代理(Remote Proxy):代理对象可以隐藏原始对象存在于远程服务器上的事实,使得客户端可以透明的访问远程对象。这对于分布式系统非常有用。
  • 虚拟代理(Virtual Proxy):当创建原始对象需要大量资源时,代理对象可以充当一个轻量级的替代品,延迟原始对象的实际创建和初始化,从而提高性能。
  • 保护代理(Pr0tection Proxy):代理对象可以控制原始对象的访问权限,确保只有具有特定权限的客户端可以访问原始对象。
  • 缓存代理(Cache Proxy):代理对象可以缓存原始对象的结果,以便在后续相同请求时能够直接返回缓存的结果,减少重复计算。
  • 日志记录代理(Logging Proxy):代理对象可以在访问原始对象之间或者之后记录日志,用于调试,监控或审计。

代理模式允许我们在不改变原始对象的情况下,通过引入代理对象来添加额外的控制和功能,这有助于提高代码的可维护性、可扩展性和灵活性。

代码实例:

// 图像接口
interface Image {
    void display();
}

// 真实图像类
class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadImageFromDisk();
    }

    private void loadImageFromDisk() {
        System.out.println("Loading image from disk: " + filename);
    }

    public void display() {
        System.out.println("Displaying image: " + filename);
    }
}

// 代理图像类
class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;

    public ProxyImage(String filename) {
        this.filename = filename;
    }

    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

// 在这个示例中,Image接口定义了display方法,RealImage是实际的图像加载类,而ProxyImage是代理图像类。
// 当ProxyImage的display方法被调用时,它会在需要时创建一个RealImage实例,并调用其display方法。
public class ProxyPatternExample {
    public static void main(String[] args) {
        Image image = new ProxyImage("sample.jpg");

        // 图像未加载,直到调用display()方法
        image.display();

        // 图像已加载,无需再次创建
        image.display();
    }
}

标签:Java,对象,代理,filename,原始,RealImage,设计模式,display
From: https://blog.51cto.com/BakerZhuang/8549105

相关文章

  • 值得收藏的一些HTML、JavaScript、ASP代码
    1.CDONTS.NewMail组件使用说明 SetMailObject=Server.CreateObject("CDONTS.NewMail") MailObject.From="发信邮箱" MailObject.To="收信邮箱" MailObject.Cc="抄送邮箱" MailObject.Bcc="密送邮箱" MailObject.Subject=&qu......
  • HTML+CSS+Javascript+Vue
    TableofContentsI.HTMLII.CSSGetStartedI.HTML按tab自动生成LabelMeaningPropertiesdiv块状元素span行间元素h1-h6标题iicon图标strong字体加粗a超链接img插入图片video插入视频controlsinput表单(输入账号、......
  • java 超大文件上传_Java+超大文件上传
    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需求,都能得到满足。小小开心了一把。但无论插件再怎么灵活,也难以应付所有的需求,比如,你要上......
  • java.sql.SQLException: ORA-02289: 序列不存在
    --CreatesequencecreatesequenceLOG_IDminvalue1maxvalue9999999999999999999999999999startwith1incrementby1cache20;如果检查没问题的话,不妨试试上面的代码,就是sequenceLog_ID未创建,希望能有所帮助!......
  • java.lang.IllegalArgumentException: Invalid uri......---------: Invalid query解
    报的错误信息:java.lang.IllegalArgumentException:Invaliduri'http://127.0.0.1:12000/GetList?txt_stratTime=2020-07-20&txt_endTime=2020-07-26&txt_fzr=&txt_bgr=&txt_jbr=中文信息&SortExpression=ASSIGNEE&SortDirection=desc':Invalidq......
  • javaString字符串转换成加减乘除
    字符串不用分割直接进行加减乘除的操作每天一个无用小技巧!try{ScriptEnginejavascript=newScriptEngineManager().getEngineByName("JavaScript");Stringstring="1*3-6+8/2";//这里是强制转换成数据类型Doubledouble=(Double)javascript.eval(string);......
  • 如何将一个JAR包添加到Java应用程序的Boot Classpath中?
    1.在启动脚本中使用-bootstrap或-Xbootclasspath选项这两个选项的使用方式如下:-bootstrap选项:java-bootstrap/path/to/your.jar-cp/path/to/your/app.jarYourMainClass-Xbootclasspath选项:java-Xbootclasspath/a:/path/to/your.jar-cp/path/to/your/app.jarYo......
  • Java 远程调用连接本地ElasticSearch服务并进行操作
    简单几步,结合Cpolar内网穿透工具实现Java远程连接操作本地ElasticsearchCpolar内网穿透提供了更高的安全性和隐私保护,通过使用加密通信通道,Cpolar技术可以确保数据传输的安全性,这为用户和团队提供了更可靠的保护,使他们能够放心地处理和存储敏感的工作内容。 1.Windows安......
  • 【JAVA】native2ascii命令详解
    参考:<https://blog.csdn.net/sinat_27933301/article/details/60358760><https://blog.csdn.net/zhuiqiuzhuoyue583/article/details/127223542>1、native2ascii简介:native2ascii是sunjavasdk提供的一个工具。用来将别的文本类文件(比如.txt,.ini,.properties,.java等等)编码......
  • Spring Boot 3.2发布:大量Java 21的支持上线,改进可观测性
    就在今天凌晨,SpringBoot3.2正式发布了!该版本是在Java21正式发布之后的重要支持版本,所以在该版本中包含大量对Java21支持的优化。下面,我们分别通过Spring官方发布的博文和JoshLong长达80+分钟的介绍视频,一起认识一下SpringBoot3.2最新版本所带来的全新内容。官方博文:http......