为什么建设银行网站,贵州省网站备案,宝塔本地wordpress,wordpress vr主题一般来说#xff0c;代理模式使用场景是远程代理、虚拟代理、安全代理等。下面来详细介绍下这三个场景是什么#xff0c;实现原理和特点。不过在介绍三个场景前#xff0c;我们还是先来回顾下代理模式。
代理模式
定义
是结构型设计模式#xff0c;引入一个对象控制对另…一般来说代理模式使用场景是远程代理、虚拟代理、安全代理等。下面来详细介绍下这三个场景是什么实现原理和特点。不过在介绍三个场景前我们还是先来回顾下代理模式。
代理模式
定义
是结构型设计模式引入一个对象控制对另一个对象的访问。代理对象在客户端和目标对象之间起到中介的作用它可以在不改变目标对象的情况下为目标对象添加额外的功能或者控制对目标对象的访问。
远程代理
定义
为一个位于不同地址空间的对象提供本地代表隐藏网络通信的细节。
原理
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();}}特点
安全代理
定义
基于不同的权限控制对真实主题的访问保证系统的安全性。
原理
安全代理的核心是在客户端与真实对象之间插入一个代理对象这个代理对象负责对客户端的请求进行安全检查和控制。
通常安全代理会实现与真实对象相同的接口这样客户端可以像使用真实对象一样使用安全代理。当客户端调用安全代理的方法时代理对象会首先进行一系列的安全检查比如验证用户身份、检查用户权限等。如果安全检查通过代理对象会将请求转发给真实对象进行处理并将真实对象的返回结果返回给客户端如果安全检查不通过代理对象可以拒绝请求或者抛出异常。
例如在一个文件访问系统中安全代理可以在用户尝试打开文件之前检查用户是否具有打开该文件的权限。如果用户有权限安全代理会调用真实的文件对象打开文件并返回结果如果用户没有权限安全代理会拒绝打开文件并抛出权限不足的异常。
特点
增强安全性通过在客户端与真实对象之间增加一层安全检查可以有效地防止未经授权的访问和恶意操作提高系统的安全性。你不必在每个真实对象的方法中都编写安全检查代码减少了代码的重复和复杂性。可定制性可以根据具体的安全需求定制安全代理的行为。例如可以根据不同的用户角色、访问场景等设置不同的安全策略。你可以灵活地调整安全代理的安全检查逻辑以适应不同的安全要求。透明性对于客户端来说使用安全代理与直接使用真实对象的方式基本相同客户端不需要关心安全代理的存在从而实现了安全机制的透明性。这使得安全代理可以很容易地集成到现有的系统中而不会对客户端的代码造成太大的影响。