设计模式——代理模式

95 阅读2分钟

一、定义

为其他对象提供一种代理以控制对这个对象的访问。
也叫委托模式,是一项基本设计技巧。

二、通用代码

  1. 抽象主题类
    可以是接口,也可以是抽象类,该类是一个最普通的业务类型定义,无特殊要求
public interface Subject{
    //定义一个方法
    public void request();
}
  1. 真实主题类
    也就是具体主题角色,也被叫做被委托角色,被代理角色
public class RealSubject implements Subject{
    //实现方法
    public void request(){
        //业务逻辑处理
    }
}
  1. 代理类 也叫做委托类、代理类。负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。
public class Proxy implements Subject{
    //需要代理哪个实现类
    private Subject subject = null;
    
    //被代理者,可自行默认,也可让场景类写入
    public Proxy(){
        this.subject = new RealSubject();
    }
    
    public Proxy(Subject _subject){
        this.subject = _subject
    }
    
    public void request(){
        this.before();
        this.subject.request();
        this.after();
    }
    
    public void before(){
        //预处理
    }
    
    public void after(){
        //善后处理
    }
    
}
  1. 场景类
public class Client{
    public static void main(String[] args){
        Subject proxy = new Proxy();
        proxy.request();
        Subject subject2 = new RealSubject();
        Subject proxy2 = new Proxy(subject2);
        proxy2.request();
    }
}

三、优点

  1. 职责清晰
  2. 高扩展性
  3. 智能化

四、使用场景

  1. Spring Aop

五、扩展

  1. 普通代理

    • 需要知道代理的存在,才可以访问
    • 客户端只能访问代理角色,不能访问真实角色
    • 适合对扩展性要求较高的场合
  2. 强制代理

    • 调用者直接调用真实角色
    • 强制调用者使用真实角色指定的代理
  3. 代理类拥有自己的个性

    • 代理类可以为真实角色预处理消息、过滤消息、消息转发、事后处理消息等功能
    • 一个代理类可以代理多个真实角色
  4. 动态代理

    • 面向切面编程
    • 动态代理者实现被代理者的所有接口,初始默认返回值为空
    • 可以在不改变原代码结构的情况下增强或控制对象的行为