代理模式

模式简介

代理模式是设计模式中的一种结构型模式(Structure Pattern),主要应用于:提供一个代理对象(Proxy)控制对一个对象(被代理对象)的访问。

UML图

类图

这里写图片描述

运行时的对象图如下:

这里写图片描述

组成部分

  • Proxy
    • 持有一个Subject实例的引用,以便在Client访问Subject实例的时候,将请求转发给Subject实例;
    • 对客户端提供和Subject一样的接口(实现Subject接口),这样就Proxy实例就可以替换Subject实例;
    • 控制对RealSubject实例的访问,负责如何创建以及销毁它;
    • 按照设计意图又可以分为几类Proxy
      • remote proxy : 将客户对RealSubject的请求和参数编码,然后将编码后的请求和参数转发到位于不同地址空间的RealSubject实例;
      • virtual proxy:保存关于RealSubject额外的调用信息,延迟对RealSubject的访问(通常是由于创建RealSubject的操作开销很大,需要延迟创建);
      • protection proxy:对RealSubject的访问者进行权限检查,以保护RealSubject(常见的就是拦截器);
  • Subject
    • 为Proxy和RealSubject定义共同的接口,以便于在RealProxy能适用的地方,Proxy都能将其替换。
  • RealSubject
    • 被代理对象,实际的操作的执行者。

例子


public interface ISubject {
    void request();
}
public abstract class AbstractProxy implements ISubject {

}
public class Proxy extends AbstractProxy {

    ISubject realSubject = new RealSubject();

    @Override
    public void request() {
        // TODO Auto-generated method stub
        System.out.println("Proxy : [before access to realSubject]");
        realSubject.request();
        System.out.println("Proxy: [after access to realSubject]");
    }

}
public class RealSubject implements ISubject {

    @Override
    public void request() {
        // TODO Auto-generated method stub
        System.out.println("RealSubject: [RealSubject request()]");
    }

}

客户端代码:

public class ProxyDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ISubject subject = new Proxy();//client依赖proxy,没有直接和RealSubject产生依赖
        subject.request();
    }
}

输出

Proxy : [before access to realSubject]
RealSubject: [RealSubject request()]
Proxy: [after access to realSubject]

应用

  • Spring AOP
  • Java CORBA和RMI 的 Stub 和 Skeleton

References

  1. 《设计模式:可复用面向对象软件的基础》
原文地址:https://www.cnblogs.com/Spground/p/9567893.html