【代理模式使用场景】

一般来说,代理模式使用场景是远程代理、虚拟代理、安全代理等。下面来详细介绍下这三个场景是什么,实现原理和特点。不过在介绍三个场景前,我们还是先来回顾下代理模式。

代理模式

定义

是结构型设计模式,引入一个对象控制对另一个对象的访问。代理对象在客户端和目标对象之间起到中介的作用,它可以在不改变目标对象的情况下,为目标对象添加额外的功能或者控制对目标对象的访问。

远程代理

定义

为一个位于不同地址空间的对象提供本地代表,隐藏网络通信的细节。

原理

1.定义远程接口

首先确定远程对象提供的服务,定义一个接口,该接口描述了远程对象能够执行的方法。例如:

 public interface RemoteServiceInterface {void doSomething();}

2.实现远程接口的服务端类

在服务端实现这个接口,提供具体的服务逻辑。例如:

  public class RemoteServiceImpl implements RemoteServiceInterface {@Overridepublic void doSomething() {System.out.println("执行远程服务端的操作");}}

3.生成远程对象的 stub 和 skeleton

使用 Java 的远程方法调用(RMI)技术时,需要通过工具生成 stub(存根)和 skeleton(骨架)。Stub 是在客户端的代理对象,它负责将方法调用转换为网络请求并发送到服务端。Skeleton 是在服务端的对象,它接收来自客户端的请求并调用实际的远程对象方法。

4.启动服务端

在服务端启动一个 RMI 注册表,并将远程对象绑定到注册表上,以便客户端能够找到它。例如:

 public class RemoteServer {public static void main(String[] args) {try {RemoteServiceInterface service = new RemoteServiceImpl();java.rmi.Naming.rebind("rmi://localhost:1099/RemoteService", service);System.out.println("远程服务已启动");} catch (Exception e) {e.printStackTrace();}}}

5.客户端调用远程代理

在客户端,通过查找注册表获取远程对象的代理,并调用远程方法。例如:

 public class RemoteClient {public static void main(String[] args) {try {RemoteServiceInterface service = (RemoteServiceInterface) java.rmi.Naming.lookup("rmi://localhost:1099/RemoteService");service.doSomething();} catch (Exception e) {e.printStackTrace();}}}

特点

一、透明性

  • 对于客户端而言,使用远程代理与使用本地对象几乎没有区别。你可以像调用本地方法一样调用远程对象的方法,而不需要关心底层的网络通信细节。
  • 这种透明性使得开发人员可以更加专注于业务逻辑的实现,而不必过多地考虑远程调用的复杂性。

二、位置独立性

  • 客户端不需要知道远程对象的实际物理位置。你只需要知道如何通过代理来访问远程对象,而代理会负责处理与远程对象的通信。
  • 这使得系统具有更好的可扩展性和灵活性,因为可以将远程对象部署在不同的服务器上,而不会影响客户端的代码。

三、网络通信管理

  • 远程代理负责处理网络通信的细节,包括建立连接、发送请求和接收响应等。你无需自己处理这些底层的网络操作,大大简化了开发过程。
  • 它可以根据网络状况进行优化,例如使用缓存、压缩数据等技术来提高通信效率。

四、安全性增强

  • 可以在远程代理中实现安全机制,对客户端的访问进行授权和认证。你可以限制只有特定的客户端才能访问远程对象,从而提高系统的安全性。
  • 还可以对传输的数据进行加密,防止数据在网络传输过程中被窃取或篡改。

五、负载均衡和故障转移

  • 在分布式系统中,可以使用多个远程对象的副本,并通过远程代理实现负载均衡。你可以将请求分发到不同的服务器上,以提高系统的性能和可用性。
  • 当某个服务器出现故障时,远程代理可以自动将请求转发到其他正常的服务器上,实现故障转移,从而提高系统的可靠性。

虚拟代理

定义

根据需要创建开销很大的对象,延迟对象的创建直到真正需要的时候。通过它来存放实例化需要很长时间、真实对象创建很耗费系统资源或者根本不存在的对象的引用。

原理

1.定义主题接口

确定被代理对象的行为,定义一个接口。例如:

public interface Image {void display();}

实现真实对象类
这是最终要被代理的对象,它实现了主题接口。例如:

   public class RealImage implements Image {private String fileName;public RealImage(String fileName) {this.fileName = fileName;loadFromDisk();}private void loadFromDisk() {System.out.println("正在从磁盘加载图像:" + fileName);}@Overridepublic void display() {System.out.println("显示图像:" + fileName);}}

3.实现虚拟代理类

虚拟代理类也实现主题接口,在其中保存对真实对象的引用或者创建真实对象的条件。当需要真正调用真实对象的方法时,才创建真实对象。例如:

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

4.客户端使用虚拟代理

在客户端,使用虚拟代理来代替真实对象进行操作。例如:

 public class Client {public static void main(String[] args) {Image image = new VirtualImage("big_image.jpg");// 首次调用,会触发真实对象的创建和加载image.display();// 再次调用,直接使用已创建的真实对象image.display();}}

特点

安全代理

定义

基于不同的权限控制对真实主题的访问,保证系统的安全性。

原理

安全代理的核心是在客户端与真实对象之间插入一个代理对象,这个代理对象负责对客户端的请求进行安全检查和控制。

通常,安全代理会实现与真实对象相同的接口,这样客户端可以像使用真实对象一样使用安全代理。当客户端调用安全代理的方法时,代理对象会首先进行一系列的安全检查,比如验证用户身份、检查用户权限等。如果安全检查通过,代理对象会将请求转发给真实对象进行处理,并将真实对象的返回结果返回给客户端;如果安全检查不通过,代理对象可以拒绝请求或者抛出异常。

例如,在一个文件访问系统中,安全代理可以在用户尝试打开文件之前,检查用户是否具有打开该文件的权限。如果用户有权限,安全代理会调用真实的文件对象打开文件并返回结果;如果用户没有权限,安全代理会拒绝打开文件并抛出权限不足的异常。

特点

  • 增强安全性:通过在客户端与真实对象之间增加一层安全检查,可以有效地防止未经授权的访问和恶意操作,提高系统的安全性。你不必在每个真实对象的方法中都编写安全检查代码,减少了代码的重复和复杂性。
  • 可定制性:可以根据具体的安全需求定制安全代理的行为。例如,可以根据不同的用户角色、访问场景等设置不同的安全策略。你可以灵活地调整安全代理的安全检查逻辑,以适应不同的安全要求。
  • 透明性:对于客户端来说,使用安全代理与直接使用真实对象的方式基本相同,客户端不需要关心安全代理的存在,从而实现了安全机制的透明性。这使得安全代理可以很容易地集成到现有的系统中,而不会对客户端的代码造成太大的影响。

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

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

相关文章

RK平台 GPIO序号转换软件

RK平台 GPIO序号转换软件 下载地址 https://download.csdn.net/download/ruidongren/89900151 链接: link

大数据毕业设计选题推荐-电影数据分析系统-电影推荐系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

VSCode中的TypeScript教程

TypeScript 是JavaScript的类型化超集,可编译为纯JavaScript。它提供了类、模块和接口来帮助您构建健壮的组件。 安装 TypeScript 编译器 Visual Studio Code 包括 TypeScript 语言支持,但不包括 TypeScript 编译器tsc。您需要在全局或工作区中安装Typ…

空间解析几何 4:空间中线段到圆的距离【附MATLAB代码】

目录 理论公式 matlab代码 理论公式 对于解一元4次方程,请详见我的博客 一元四次方程求解 -【附MATLAB代码】-CSDN博客文章浏览阅读1.4k次,点赞41次,收藏4次。最近在研究机器人的干涉(碰撞)检测,遇到了一…

015_基于django旅游数据分析与推荐系统2024_cg8s735i

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

使用Docker启动的Redis容器使用的配置文件路径等问题以及Python使用clickhouse_driver操作clickhouse数据库

一、使用Docker启动的Redis容器使用的配置文件路径等问题 1.docker启动的redis使用的配置文件路径是什么 使用docker搭建redis服务,本身redis启动的时候可以指定配置文件的, redis-server /指定配置文件路径/redis.conf。 但手上也没有一个redis配置文件…

win10上安装wsl(ubuntu)

1,搜索到微软网站下载 Ubuntu Installer.exe文件,运行它。 2.根据提示点击获取ubuntu,自动下载完之后提示安装,do。 3.出错:Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x8007019e Error: 0x8…

吴伟仁《英国文学史及选读》第一二册课后答案PDF

新经典高等学校英语专业系列教材《英国文学史及选读》根据英国文学历史的顺序结合作品选读编写而成,在历史部分,对英国文学史的每个阶段作了简明扼要的概述,而在作品选读部分则尽可能遴选了文学史上的重要作家和重要作品。教材内容丰富&#…

Web集群服务-代理和负载均衡

1. 概述 1. 用户----->代理--->Web节点,后面只有一个节点,一般使用的是nginx代理功能即可 2. 后面如果是集群需要使用nginx负载均衡功能 2. 代理分类 代理分类方向应用正向代理用户(服务器)-->代理--->外部(某网站)服务器通过代理实现共享上网/访问公网反向代理用…

MySQL-事务Transaction详解

文章目录 事务概述事务基本概念事务四大特性(ACID)演示MySQL事务手动开启事务MySQL默认事务机制 事务的隔离级别隔离级别基本概述三种现象脏读不可重复读幻读 查看和设置隔离级别四种隔离级别及演示读未提交(read uncommitted)读提交(read committed)可重复读(repeatable read)…

颠覆Transformer的Mamba模型[精简版本]------S4

1、改进transformer不擅长处理超长的序列的问题:输入u到状态x 序列数据一般都是离散的数据 比如文本、图、DNA,但现实生活中还有很多连续的数据,比如音频、视频,对于音视频这种信号而言,其一个重要特点就是有极长的context window,而在transformer长context上往往会失败,…

Spring Boot技术栈的电影评论网站设计与实现

6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…

算法——python实现堆排序

文章目录 堆排序二叉树堆堆排序的过程:代码实现python中的heapq模块 堆排序 二叉树 关于二叉树的操作,其实核心就是 父节点找子节点,子节点找父节点 如果要将二叉树存储到队列中,就需要找出 父子节点之间的规律: 父…

什么是SYN flood,如何处理

在数字化时代,随着互联网的普及和技术的飞速发展,网络安全问题变得日益严峻。Flood攻击,作为一种典型的网络攻击手段,对个人和企业的信息安全构成了重大威胁。通过深入了解Flood攻击的概念、特点、影响及解决方案,我们…

Sentinel 快速入门

前置推荐阅读:Sentinel 介绍-CSDN博客 前置推荐阅读:Nacos快速入门-CSDN博客 快速开始 欢迎来到 Sentinel 的世界!这篇新手指南将指引您快速入门 Sentinel。 Sentinel 的使用可以分为两个部分: 核心库(Java 客户端)&#xff1a…

现代数字信号处理I-P4 CRLB+LMMSE 学习笔记

目录 学习资料视频链接: 1. 估计参数的CRLB回顾 2. 参数变换下的CRLB拓展 3. 矢量参数下的CRLB扩展 3.1 矢量参数下的CRLB公式 3.2 两个矩阵不等式关系的意义说明 3.3 矢量参数下CRLB公式的证明过程 4. 线性估计 重点注意事项:此处的线性估计&am…

【React】React18核心源码解读

前言 本文使用 React18.2.0 的源码,如果想回退到某一版本执行git checkout tags/v18.2.0即可。如果打开源码发现js文件报ts类型错误请看本人另一篇文章:VsCode查看React源码全是类型报错如何解决。 阅读源码的过程: 下载源码 观察 package…

【java面经thinking】二

目录 redis了解 使用原因 应用场景 数据类型 redis事务 数据持久化 RDB(快照): AOF(即时更新): 选择方式: redis快速的原因 redis单线程 单机瓶颈 经典3问 参考博客 redis了解 缓存中间件 使用原因 缓解高并发、提升高可用。…

Qt 实现动态时钟

1.实现效果 2.widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace

归一化输入

当输入的不同的特征取值范围差异过大&#xff0c;取得对应参数差别也会很大&#xff0c;在对参数进行优化的过程中&#xff0c;参数小的维度步长较小&#xff0c;参数大的维度步长较大&#xff0c;优化过程中路径曲折&#xff0c;将输入归一化&#xff0c;使特征取值范围差别小…