【代理模式使用场景】

server/2024/10/20 16:13:00/

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

代理模式

定义

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

远程代理

定义

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

原理

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.ppmy.cn/server/133385.html

相关文章

深度学习基础知识-02 数据预处理

深度学习的数据预处理通常包括: 1.数据清洗:去除错误或不完整的数据。 2.归一化:调整数据范围,如将像素值缩放到0-1。 3.数据增强:通过旋转、缩放等方法增加数据多样性。 4.数据划分:将数据分为训练集、验证…

使用LLM和RAG进行数据库查询(文本到SQL)的四大挑战及解决方案

大型语言模型(LLM)的出现展示了机器理解自然语言的能力。这些能力帮助工程师完成了许多令人惊叹的工作,比如编写代码文档和代码审查,而最常见的用例之一是代码生成;GitHub Copilot展示了AI理解工程师代码生成意图的能力…

微信开发者工具:音乐小程序报错

报错信息 GET http://localhost:3000/1.mp3 net::ERR CONNECTION REFUSED (env: Windows,mp,1.06.2303220;lib:3.6.0) 原因:小程序没有直接获取本地文件,为了提高访问速度,而采用放到网络服务器中网络访问的方式获取文件内容 解决办法&#…

为图片添加水印(Python)

简介 刚好学了一下tkinter.colorchooser,然后…… 优化了以前的代码,不过仍然是shi 功能 可自由添加水印内容、选择颜色、字体及字体大小、图片、水印的x、y位置 代码 # -*- coding: utf-8 -*- # Environment PyCharm # File_name visibleWat…

python 作业1

任务1: python为主的工作是很少的 学习的python的优势在于制作工具,制作合适的工具可以提高我们在工作中的工作效率的工具 提高我们的竞争优势。 任务2: 不换行 换行 任务3: 安装pycharm 进入相应网站Download PyCharm: The Python IDE for data science and we…

输入输出--I/O流【C++提升】

1.1基础知识&#xff1a; 在C中&#xff0c;输入输出&#xff08;IO&#xff09;流是通过标准库中的 <iostream> 头文件来处理的。C 提供了几种基本的输入输出流类&#xff0c;最常用的有以下几种&#xff1a; std::cin&#xff1a;用于输入。std::cout&#xff1a;用于…

Vulhub Wakanda : 1靶机详解

1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.7.0/24|grep -B 2 08:00:27:DB:19:701.2. 端口扫描 nmap 192.168.7.171 -p- -A1.3. 目录扫描 dirb http://192.168.7.1711.4. 敏感信息收集 whatweb http://192.168.7.1712. WEB打点寻找漏洞点 …

IC验证面试中常问知识点总结(八)附带详细回答!!!

16、 callback机制 16.1 callback机制有什么用? 程序的设计者有时不是程序的使用者,所以作为程序的使用者来说,总是希望程序的设计者能够提供一些接口来满足自己的应用需求。作为这两者之间的一个协调,callback机制出现了。 第一,callback机制可以提高验证平台的可重用性…