自学内容网 自学内容网

【代理模式使用场景】

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

代理模式

定义

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

远程代理

定义

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

原理

1.定义远程接口

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

 public interface RemoteServiceInterface {
       void doSomething();
   }

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

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

  public class RemoteServiceImpl implements RemoteServiceInterface {
       @Override
       public 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);
       }

       @Override
       public 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;
       }

       @Override
       public 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();
       }
   }

特点

安全代理

定义

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

原理

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

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

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

特点

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

原文地址:https://blog.csdn.net/yanwenwennihao/article/details/143068096

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!