【Java 设计模式】结构型之代理模式

news/2024/7/6 6:32:35 标签: java, 设计模式, 代理模式

文章目录

    • 1. 定义
    • 2. 应用场景
    • 3. 代码实现
    • 结语

代理模式(Proxy Pattern)是一种结构型设计模式它允许通过一个代理对象控制对其他对象的访问代理模式在访问对象时引入了一定程度的间接性,使得可以在访问对象前后进行一些额外的操作。在本文中,我们将深入研究Java中代理模式的定义、结构、使用场景以及如何在实际开发中应用。

1. 定义

代理模式是一种结构型设计模式,它允许通过一个代理对象控制对其他对象的访问。代理模式引入了一定程度的间接性,使得可以在访问对象前后进行一些额外的操作。代理模式通常包含三个主要角色:抽象主题(Subject)、真实主题(RealSubject)和代理(Proxy)。

  • 抽象主题(Subject): 定义了真实主题和代理的共同接口,可以是接口或抽象类。
  • 真实主题(RealSubject): 实现了抽象主题接口,是代理模式中的真实对象。
  • 代理(Proxy): 实现了抽象主题接口,包含一个指向真实主题的引用,可以控制对真实主题的访问。

2. 应用场景

代理模式通常在以下场景中使用:

  • 远程代理:

    当需要在不同地址空间中访问对象时,可以使用远程代理。远程代理在本地代理和远程对象之间充当中介,使得客户端可以通过代理访问远程对象。

  • 虚拟代理:

    当需要延迟创建或初始化对象时,可以使用虚拟代理。虚拟代理在真正需要使用对象时才创建或初始化,可以提高系统的性能。

  • 保护代理:

    当需要控制对对象的访问权限时,可以使用保护代理。保护代理通过对客户端的访问进行控制,限制了对真实主题的直接访问。

  • 缓存代理:

    当需要缓存对象的访问结果时,可以使用缓存代理。缓存代理在访问真实主题之前检查缓存,如果缓存中存在结果,则直接返回缓存的结果,否则访问真实主题并将结果缓存起来。

3. 代码实现

下面通过一个简单的例子来演示代理模式的实现。假设有一个图像加载器,加载大图像可能会耗费较长时间,我们可以使用代理模式来引入一个代理对象,控制对图像加载的访问。

抽象主题 - 图像接口 Image

java">package com.cheney.demo;

interface Image {
    void display();
}

真实主题 - 真实图像 RealImage

java">package com.cheney.demo;

class RealImage implements Image {
    private String filename;

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

    private void loadImageFromDisk() {
        System.out.println("从硬盘加载图片: " + filename);
    }

    @Override
    public void display() {
        System.out.println("显示图片: " + filename);
    }
}

代理 - 图像代理 ImageProxy

java">package com.cheney.demo;

class ImageProxy implements Image {
    private RealImage realImage;
    private String filename;

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

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

客户端启动类 Main

java">package com.cheney.demo;

public class Main {
    public static void main(String[] args) {
        // 使用代理模式加载图像
        Image image = new ImageProxy("large_image.jpg");

        // 第一次显示图像
        image.display();

        // 第二次显示图像(不会再次加载,直接显示缓存的结果)
        image.display();
    }
}

在上述例子中,Image 是抽象主题,定义了图像的接口。RealImage 是真实主题,实现了抽象主题接口,表示真实的图像。ImageProxy 是代理,实现了抽象主题接口,包含一个指向真实主题的引用,控制对真实主题的访问。

在客户端中,我们使用代理模式加载图像。第一次显示图像时,代理对象会创建并初始化真实主题,并显示图像。第二次显示图像时,代理对象直接显示缓存的结果,无需再次加载。

结语

代理模式是一种结构型设计模式,通过引入一个代理对象,可以控制对其他对象的访问。在实际开发中,代理模式常被用于实现远程代理、虚拟代理、保护代理、缓存代理等场景。通过合理使用代理模式,可以提高系统的灵活性、可维护性,并且降低客户端与真实对象之间的耦合。


http://www.niftyadmin.cn/n/5337341.html

相关文章

Webpack5入门到原理22:提升打包构建速度

HotModuleReplacement 为什么 开发时我们修改了其中一个模块代码,Webpack 默认会将所有模块全部重新打包编译,速度很慢。 所以我们需要做到修改某个模块代码,就只有这个模块代码需要重新打包编译,其他模块不变,这样…

论文阅读_CogTree_推理的认知树

英文名称: From Complex to Simple: Unraveling the Cognitive Tree for Reasoning with Small Language Models中文名称: 从复杂到简单:揭示小型语言模型推理的认知树链接: http://arxiv.org/abs/2311.06754v1代码: https://github.com/alibaba/EasyNLP作者: Junbi…

Cortex-M3/M4内核NVIC及HAL库函数详解(4):使用HAL库配置外部中断

0 工具准备 Keil uVision5 Cortex M3权威指南(中文) Cortex M3与M4权威指南 stm32f407的HAL库工程 STM32F4xx中文参考手册 1 使用HAL库配置外部中断 前面我们已经熟悉了有关内核部分的寄存器配置,接下来我们结合stm32f407的GPIO外设&#xf…

前端和后端交互方式

前端和后端交互一般通过HTTP请求和响应来进行。前端通过浏览器向后端发送请求,后端收到请求后进行处理并返回响应,前端接收响应后进行相应的处理。具体的交互方式如下: AJAX:前端通过JavaScript发起异步请求,向后端发…

鸿蒙 HarmonyOS ArkTS ArkUI 动画 中心扩展、向下扩展、纵向扩展

EntryComponentstruct Index {State widthA: number 0State heightA: number 0onPageShow():void{animateTo ( {duration: 2000,iterations: -1,curve:Curve.Linear}, () > {this.widthA 200this.heightA 200} )}build() {Column() {// 中心扩展Column(){}.width(this.wi…

MySQL 索引(下)

🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:重拾MySQL-进阶篇 🍹文章作者技术和水平很有限,如果文中出现…

给github设置代理

1 引言 本文详细介绍了在 Linux 环境下配置和使用网络代理的步骤。包括使用环境变量设置代理的方法、在 Git 中配置代理的常用方法以及一些调试工具。这些内容对于需要在网络受限环境下使用 Git 的用户非常实用。 2 配置代理 export http_proxyhttp://host:port/ export h…

matlab appdesigner系列-常用13-标签

标签,用来显示各类文本 此示例,就是在标签之外的画布上单击鼠标左键,显示王勃的《滕王阁诗》 操作如下: 1)将2个标签拖拽到画布上,并修改相应文字。将第二个标签的右侧文本信息中的Wordwrap打开&#xf…