Linux下的设计模式——代理模式(Proxy Pattern)深入浅出【建议新手收藏】

代理模式的本质是一个中间件,主要目的是解耦合服务提供者和使用者。使用者通过代理间接的访问服务提供者,便于后者的封装和控制。是一种结构性模式。

一、目的

为外部调用者提供一个访问服务提供者的代理对象。

二、动机

限制对目标对象的直接访问,降低耦合度。

三、优缺点

优点

  • 低耦合
  • 易扩展
  • 灵活度高

缺点:

  • 间接访问可能会延迟请求相应
  • 增加工作量

四、分类

  • 静态代理
  • 动态代理

代理类本身的实现可能并不简单,加上每一个需要代理的对象均均需要实现一个代理类,其工作量本身比较大,易出错。所谓动态代理(DynamicProxy)是指在程序运行时动态的生成对目标对象的访问接口。本文主要介绍前者,关于后者可以参考JDK自带的动态代理。

五、主要用途

代理模式在以下场景比较适用:

  1. 远程代理
  2. 虚代理
  3. 保护代理
  4. 智能指引代理
  5. 写时复制(Copy-on-Write)代理
  6. 缓存代理
  7. 防火墙代理
  8. 同步化代理

六、原理

下面是GoF介绍典型的代理模式UML类图
在这里插入图片描述
Subject:
 定义RealSubject对外的接口,且这些接口必须被Proxy实现,这样外部调用proxy的接口最终都被转化为对realsubject的调用。
 
RealSubject:
 真正的目标对象。

Proxy:
目标对象的代理,负责控制和管理目标对象,并间接地传递外部对目标对象的访问。

  • Remote Proxy: 对本地的请求以及参数进行序列化,向远程对象发送请求,并对响应结果进行反序列化,将最终结果反馈给调用者;
  • Virtual Proxy: 当目标对象的创建开销比较大的时候,可以使用延迟或者异步的方式创建目标对象;
  • Protection Proxy: 细化对目标对象访问权限的控制;

七、实现

下面我们使用两个例子来实际体验一下代理模式的应用

网络代理
对于一些国内不能直接访问的网站,合法的使用的网络代理可以实现对目标网站的访问;
在这里插入图片描述
定义公共接口类Server:

public interface Server{
    
    
    void visit(String url);
}

代理服务器ProxyServer:

public class ProxyServer implements Server{
    
    
 
   private RealServer realServer;
 
   public ProxyServer(String serverName){
    
    
      this.realServer = new RealServer(serverName);
   }
 
   @Override
   public void visit(String url) {
    
    
      realServer.visit(url);
   }
}

目标服务器RealServer:

public class RealServer implements Server {
    
    
    private String serverName;
    public RealServer(String serverName) {
    
    
        this.serverName = serverName;
        System.out.println("This is " + serverName);
    }
    
    @Override
    public void visit(String url) {
    
    
        response(url);
    }
    
    private void response(String res) {
    
    
        System.out.println("This is response of " + res + " from server:" + serverName);
    }
}

演示:

public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Server server = new ProxyServer("www.google.com");
        server.visit("map.google.com");
    }
}

智能指针引用计数

下面使用代理模式简单的模拟指针引用计数问题

接口类Obj:

public interface Obj{
    
    
    void GetAttr();
    Obj copy();
    void delete();
}

智能指针类SmartPointer:

View Code

被引用对象类RealObj:

View Code

还等什么小编推荐自己的linuxC/C++语言交流群:【1106675687】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!前100名进群领取,额外赠送一份价值199的C/C++、linux资料包含(视频教程、电子书、实战项目及代码),下面部分展示。

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_50662680/article/details/112606880
今日推荐