13-Java代理模式 ( Proxy Pattern )

Java代理模式

    • 摘要
    • 实现
    • 范例

  • 代理模式(Proxy Pattern)使用一个类代表另一个类的功能

  • 代理模式创建具有现有对象的对象,以便向外界提供功能接口

代理模式属于结构型模式

摘要

1. 意图

为其他对象提供一种代理以控制对这个对象的访问

2. 主要解决

  • 在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上
  • 在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层

3. 何时使用

  • 想在访问一个类时做一些控制

4. 如何解决

  • 增加中间层

5. 关键代码

  • 实现与被代理类组合

6. 应用实例

  • 买火车票不一定在火车站买,也可以去代售点;
  • 一张支票或银行存单是账户中资金的代理,支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制;
  • springaop;

7. 优点

  • 职责清晰;
  • 高扩展性;
  • 智能化;

8. 缺点

  • 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢;
  • 实现代理模式需要额外的工作,有些代理模式的实现非常复杂;

9. 使用场景

  • 远程代理;
  • 虚拟代理;
  • Copy-on-Write代理;
  • 保护(ProtectorAccess)代理;
  • Cache代理;
  • 同步化(Synchronization)代理;
  • 智能引用(SmartReference)代理;

10. 注意事项

  • 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口;
  • 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制;

实现

在这里插入图片描述

  1. 定义一个Image接口和实现了Image接口的实体类;
  2. 定义代理类ProxyImage,减少RealImage对象加载的内存占用;
  3. 定义类ProxyPatternDemo使用ProxyImage来获取要加载的Image对象,并按照需求进行显示;

范例

1.创建一个接口.

Image.java

package com.demo.gof;
public interface Image {void display();
}

2. 创建实现接口的实体类

RealImage.java

package com.demo.gof;
public class RealImage implements Image {private String fileName;public RealImage(String fileName){this.fileName = fileName;loadFromDisk(fileName);}@Overridepublic void display() {System.out.println("Displaying " + fileName);}private void loadFromDisk(String fileName){System.out.println("Loading " + fileName);}
}

ProxyImage.java

public class ProxyImage implements Image{private RealImage realImage;private String fileName;public ProxyImage(String fileName){this.fileName = fileName;}@Overridepublic void display() {if(realImage == null){realImage = new RealImage(fileName);}realImage.display();}
}

3. 当被请求时,使用 ProxyImage 来获取 RealImage 类的对象

ProxyPatternDemo.java

package com.demo.gof;
public class ProxyPatternDemo {public static void main(String[] args) {Image image = new ProxyImage("test_10mb.jpg");//图像将从磁盘加载image.display(); System.out.println("");//图像将无法从磁盘加载image.display();  }
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/ProxyPatternDemo.java
$ java  com.demo.gof.ProxyPatternDemo
Loading test_10mb.jpg
Displaying test_10mb.jpgDisplaying test_10mb.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣206反转链表

206.反转链表 力扣题目链接(opens new window) 题意:反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 1,双指针 2,递归。递归参考双指针更容易写, 为什么不用头插…

3.1_2024ctf青少年比赛部分web题

php后门 根据x-powered-by知道php的版本 该版本存在漏洞: PHP 8.1.0-dev 开发版本后门 根据报错信息,进行提示,前 GET / HTTP/1.1 Host: challenge.qsnctf.com:31639 User-Agentt:12345678system(cat /flag);var_dump(2*3);zerodium12345678…

【小白学机器学习6】真实值,观测值,拟合值,以及数据的误差的评价:集中趋势,离散度,形状等

目录 1 世界上有哪几种值?只有3种值 1.1 真值/真实值/理想值/主观值(形而上学世界里) 1.2 实际值/现实值/观测值/样本值(看到的/记录下来的) 1.3 拟合值/预测值(算出来的) 2 对数据的各种…

springboot项目单纯使用nacos注册中心功能

Spring Boot 项目完全可以单独使用 Nacos 作为注册中心。Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它支持服务的注册与发现,能够与 Spring Boot 应用无缝集成,为微服务架构提供了强大的支持。 在使用 Nacos 作为注册中…

Python实现DMI工具判断信号:股票技术分析的工具系列(3)

Python实现DMI工具判断信号:股票技术分析的工具系列(3) 介绍算法解释 代码rolling函数介绍完整代码 介绍 先看看官方介绍: DMI (趋向指标) 用法 1.PDI线从下向上突破MDI线,显示有新多头进场,为…

BUUCTF---[BJDCTF2020]藏藏藏1

1.题目描述 2.下载附件,解压之后是一张图片和一个文本 3.把图片放在winhex,发现图片里面包含压缩包 4.在kali中使用binwalk查看,然后使用foremost分离,在使用tree查看分离出来的文件,最后将zip文件使用unzip进行解压。步骤如下 5.…

pdf编辑软件哪个好用?5款PDF编辑器分享

pdf编辑软件哪个好用?PDF编辑软件在现代办公和学术研究中发挥着举足轻重的作用,它们不仅具备基础的编辑和修改功能,还能够支持多种注释工具,帮助我们高效地管理和整理PDF文件。无论是需要调整文档布局、添加文本或图像&#xff0c…

C++ 前缀和

目录 例1 例2 例3 例4 例5 例6 例7 例8 例1 DP34 【模板】前缀和 分析:dp和arr的大小并不是固定的,就是有没有偏移量,这里的n是从1开始,不如直接放到下标1处,在最后的减法时,如果用第一个参考代码会…

rtt的io设备框架面向对象学习-touch设备

目录 1.触摸设备基类2.触摸设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 io设备管理层 4.总结5.使用5.1实例 1.触摸设备基类 此层处于设备驱动框架层。此层的类是抽象类。 在/ components / drivers / include / drivers /touch.h定义了如下touch设备…

Ai学社致力于Ai视觉设计和AI绘画

Ai学社来啦!致力于短时间搞定Ai视觉设计、AI绘画。 遍知首席Ai讲师,教大家如何利用Ai迅速提升工作效率,升职加xin!目前申请对ai感兴趣的均可以参加!免费报名。 招生人数:本批次至少招募100名。招生时间&…

LeetCode-02

225. 用队列实现栈 用两个队列实现栈的功能,思路如下: 往空队列中放新元素把非空队列中的元素依次放入刚才添加了新元素的队列,直到非空队列变为空队列 class MyStack(object):def __init__(self):self.queue1 []self.queue2 []def push(…

【教程】Kotlin语言学习笔记(四)——方法(持续更新)

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 文章目录 【…

突发,Anthropic推出突破性Claude 3系列模型,性能超越GPT-4

🦉 AI新闻 🚀 突发,Anthropic推出突破性Claude 3系列模型 摘要:人工智能创业公司Anthropic宣布推出其Claude 3系列大型语言模型,该系列包括Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus三个子模型,旨…

Cesium 自定义Primitive-绘制圆

一、创作来源 1、cesium的entity绘制圆 2、不使用entity的情况下,使用自定义的primitive来动态绘制圆 3、结合上一篇文章的圆,执行动态圆的更新 二、编写步骤 1、创建绘制线的类 包括构造函数、绘图函数以及销毁函数 import { Viewer, ScreenSpaceEven…

docker-compose启动postgres数据库,实现主从备份

文章目录 1. 主库2. 从库3. 测试 1. 主库 创建pg-m 目录,并进入该目录创建docker-compose.yml文件,内容如下: version: "3.1" services:pg_master:image: postgres:15.3container_name: pg_masterenvironment:POSTGRES_PASSWORD:…

Domain Adaptation Vs. Prompt-Tuning:能否用域自适应解决大模型提示学习问题?

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 作者简介 李江梦,中国科学院软件研究所天基综合信息系统全国重点实验室助理研究员 论文简介 今天介绍的是被机器学习领域顶级学术会议ICLR 2024接收的论文:BayesPrompt: Prompting Large…

广东Lenovo SR588服务器维修升级硬盘内存

本案例描述了对联想SR588服务器进行硬件升级的过程,包括更换固态硬盘作为系统盘,以及增加内存容量至128GB。升级后,服务器性能得到显著提升,同时通过重新配置RAID阵列和操作系统的重新安装,确保了系统的稳定性和数据的…

STM32 NAND FLASH知识点

1.NAND FLASH的简介 NAND FLASH 的概念是由东芝公司在 1989 年率先提出,它内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。 NAND FLASH 存储器具有容量较大,改写速度快等优点,适用于大量数据的存储&…

如何利用Flutter来写后端 服务端应用

前言 Flutter是谷歌推出的一款跨平台开发框架,现在属于此领域star最多的框架,其被广泛应用于构建前台界面,但或许很少人知道,他也可以写后端应用。 本文主角 flutter非常著名的getx库推出的get server jonataslaw/get_server:…

实验01-STP+链路聚合+VRRP实验

1.实验拓扑 2 实验需求 根据拓扑图配置IP地址。交换机之间通过STP防环为了防止SW2-SW3之间聚合的高效链路被STP 阻塞,请配置SW2 为网络中的主根,SW3为网络中的备份根桥。通过VRRP实现网关冗余,网关在SW2和SW3上,其中VLAN10的网关…