代理模式 rust和java的实现

文章目录

    • 代理模式
      • 介绍
      • 实现
      • java
      • rust
  • rust仓库

代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

介绍

  • 意图:为其他对象提供一种代理以控制对这个对象的访问。

  • 代理模式的主要优点有:

    • 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
    • 代理对象可以扩展目标对象的功能;
    • 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度;
  • 其主要缺点是:

    • 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
    • 增加了系统的复杂度;
  • 应用实例: 1、买火车票不一定在火车站买,也可以去代售点。 2、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。 3、spring aop。

  • 使用场景:按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。

实现

我们将创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用。

ProxyPatternDemo 类使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示。

代理模式的 UML 图

java

步骤 1
创建一个接口。

Image.java

public interface Image {void display();
}

步骤 2
创建实现接口的实体类。

RealImage.java

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

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

步骤 4
执行程序,输出结果:

Loading test_10mb.jpg
Displaying test_10mb.jpgDisplaying test_10mb.jpg

rust

rust和java的搭建过程类似,如就不再赘述rust搭建过程。

trait Image {fn dispaly(&self);
}
struct RealImage{file_name:String,
}
impl RealImage {fn load_from_disk(&self) {println!("Loading {}",self.file_name)}fn new(file_name:String)->RealImage {let i=RealImage { file_name:file_name.clone() };i.load_from_disk();i}
}impl Image for RealImage {fn dispaly(&self) {println!("Displaying  {}",self.file_name.as_str())}
}
struct  ProxyImage{real_image: RealImage,file_name:String}
impl ProxyImage {fn new(file_name:String)->ProxyImage {ProxyImage{real_image:RealImage::new(file_name.clone()),file_name:file_name}}
}
impl Image for ProxyImage {fn dispaly(&self) {self.real_image.dispaly();}
}
fn main() {let pi=ProxyImage::new("test_10mb.jpg".to_string());pi.dispaly();pi.dispaly();
}

rust仓库

https://github.com/onenewcode/design.git
本教程项目在bin文件夹下的proxy.rs文件中

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

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

相关文章

jquery中ajax总结

在ajax请求接口的时候,常用到以下参数,在这里记录下 contentType用于告诉服务器请求的数据类型,常见的有 text/html:HTML网页 text/plain:纯文本 application/json:JSON格式 application/xml:XM…

“KeyarchOS:国产Linux新星的崛起与创新之路“

简介 KeyarchOS是一款由浪潮信息自主研发的服务器操作系统。它因为几个特点而受到我的青睐和一些用户的关注。 首先,KeyarchOS注重安全性和稳定性。它有一些防护和隔离功能,来帮助系统稳定运行,而且是中文语言更接地气。 其次,Ke…

OSG编程指南<十>:OSG几何体的绘制

1、场景基本绘图类 在 OSG 中创建几何体的方法比较简单,通常有 3 种处理几何体的手段: 使用松散封装的OpenGL 绘图基元;使用 OSG 中的基本几何体;从文件中导入场景模型。 使用松散封装的OpenGL 绘图基元绘制几何体具有很强的灵活…

牛气霸屏-快抖云推独立版V1.6.7

介绍 快抖云推全插件独立版是最近很火的牛气霸屏系统独立版,牛气霸屏系统就是商家通过系统在线创建抖音或快手霸屏活动,并生成该活动的爆客二维码,用户通过扫二维码即可参加活动(活动可以是领取卡劵,抽奖等&#xff0…

DevExpress中文教程 - 如何在macOS和Linux (CTP)上创建、修改报表(下)

DevExpress Reporting是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。 DevExpress Reports — 跨平台报表组件&#x…

linux(1)之build构建系统基础(一)

Linux(1)之buildroot构建系统(一) Author:Onceday Date:2023年11月12日 漫漫长路,才刚刚开始… 参考文档: The Yocto ProjectBuildroot - Making Embedded Linux Easy 文章目录 Linux(1)之buildroot构建系统(一)1. 概述1.1 如…

企业数字化转型转什么?怎么转?这份攻略请收好

目录 -01-数字化转型“是什么” -02-数据驱动推动企业数字化转型 -03-企业数字化转型的行动路线图 数字化转型,转什么?怎么转?这些问题仍在困扰不少企业,也是每个企业转型升级不得不思考的重要问题。对此,中关村数字…

Python潮流周刊#1:如何系统地自学Python?

这里记录每周值得分享的 Python 及通用技术内容,部分内容为英文,已在小标题注明。(本期标题取自其中一则分享,不代表全部内容都是该主题,特此声明。) 文章&教程 1、编程语言的错误处理模式 文章讨论…

requests请求django接口跨域问题处理

参考: https://zhuanlan.zhihu.com/p/416978320 https://blog.csdn.net/SweetHeartHuaZai/article/details/130983179 使用httpx代替requests import httpxheaders {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.3…

销售为什么会选择使用电销这种方式 ?

在网络经济时代的大环境下,网络营销作为一种新型营销模式和营销理念,已经抢占了大部分市场。 网络营销,是指利用互联网技术和现代信息技术,以及社交媒体平台,进行产品宣传、销售、服务、品牌传播等活动的一种营销模式。…

MySQL-进阶

存储引擎 MySQL体系结构 连接层: 最上层是一些客户端和连接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层: 第二层架构主要完成大多数的核心服务功能&…

财报解读:三季度的美国零售,“沃尔玛效应”仍在持续

经济学中常用“沃尔玛效应”来指代“消费者减少消费时,会选择每种类别中价格最低的商品”这一现象。作为全球最大的零售商,沃尔玛一定程度上成为了消费市场的风向标。 近日,沃尔玛发布的2024财年第三季度财报显示,其相较去年同期…

虚拟机(Linux)系统知识普及:什么是Linux发行版 以及各发行版的区别

什么是Linux发行版 以及各发行版的区别 一. 什么是linux发行版简单来说正式定义区别资料1区别资料2区别资料3区别资料4注意事项二. Linux发行版:CentOS、Ubuntu、RedHat、Android、Tizen、MeeGoLinux 发行版:RedhatDebianUbuntuGentooFreeBSD

22款奔驰S400L升级主动式氛围灯 光影彰显奔驰的完美

新款奔驰S级原车自带64色氛围灯,还可以升级原厂的主动式氛围灯,增加车内的氛围效果。主动式环境氛围灯包含263个LED光源,每隔1.6厘米就有一个LED光源,照明效果较过去明亮10倍,视觉效果更加绚丽,它还可结合智…

Python中的下划线使用教程:单下划线、双下划线和头尾双下划线详解

概要 Python是一种简单、易学、功能强大的编程语言,被广泛应用于各种领域。在Python中,下划线的使用有其特殊的含义和用途。本文将详细介绍Python中的单下划线、双下划线和头尾双下划线的使用教程,帮助读者更好地理解和应用这些特性。 一、单…

干货!ERP软件如何帮助企业实现信息化管理?

ERP即企业资源规划(Enterprise Resource Planning)系统,其核心是物料的追踪流转。而在物料追踪流转的基础上,又衍生出一系列各类资源计划的管理和追踪。因此ERP发展成为一款集成各类资源计划,也就是集成企业核心业务流…

化学气相沉积(CVD)中的TEOS

在半导体制程中,薄膜的沉积是核心的步骤之一,有接触过CVD的小伙伴应该或多或少听过TEOS这种物质,TEOS作为一种重要的沉积源,尤其在低温氧化硅的生成过程中,发挥了无可替代的角色。今天我们就来聊聊这种物质。 什么是TE…

ES开启安全认证

elasticsearch开启安全认证步骤 1.创建证书 进入到es主目录下执行 ./bin/elasticsearch-certutil ca Elasticsearch开启安全认证详细步骤 第一个证书名称默认,直接回车 第二个输入密码,直接回车 完成后会生成一个文件:elastic-stack-ca.p12…

创新研报|顺应全球数字化,能源企业以“双碳”为目标的转型迫在眉睫

能源行业现状及痛点分析 挑战一:数字感知能力较弱 挑战二:与业务的融合度低 挑战三:决策响应速度滞后 挑战四:价值创造有待提升 挑战五:安全风险如影随形 能源数字化转型定义及架构 能源行业数字化转型体系大体…

windows电脑定时开关机设置

设置流程 右击【此电脑】>【管理】 【任务计划程序】>【创建基本任务】 gina 命令 查看 已经添加的定时任务从哪看?这里: 往下滑啦,看你刚才添加的任务: