设计模式之代理模式

2017-06-07  本文已影响5人  老羊_肖恩

代理模式(Proxy Pattern)是一个使用率非常高的模式,其定义如下: Provide a surrogate or placeholder for another object to control access to it. 即:为其他对象提供一种代理以控制对这个对象的访问。
代理模式的通用类图如下图所示:

Proxy.jpg

  代理模式也叫做委托模式,它是一项基本设计技巧,许多模式,如状态模式,策略模式,访问者模式本质上都采用了委托模式。我们先看一下类图中三个角色的定义:

//抽象业务类
public interface Subject{
    //抽象业务方法
    public void  request();
}

//具体业务类1
public class RealSubject1 implements Subject{

    //实现业务方法
    @Override
    public void request() {
        System.out.println("RealSubject 1 业务逻辑处理...");
    }

}

//具体业务类2
public class RealSubject2 implements Subject{

    //实现业务方法
    @Override
    public void request() {
        System.out.println("RealSubject 2 业务逻辑处理...");
    }

}

public class Proxy implements Subject{
    //要代理的实现类
    private Subject subject = null;
    
    //默认被代理者
    public Proxy(){
        this.subject = new RealSubject1();
    }
    
    //通过构造函数传递代理者
    public Proxy(Subject subject) {
        this.subject = subject;
    }

    //实现处理方法
    @Override
    public void request() {
        this.before();
        this.subject.request();
        this.after();
    }

    //代理预处理
    private void before(){
        System.out.println("Proxy before...");
    }
    
    //代理后处理
    private void after(){
        System.out.println("Proxy after...");
    }
}

public class ProxyClient {
    public static void main(String[] args) {
        Proxy proxy1 = new Proxy();
        Proxy proxy2 = new Proxy(new RealSubject2());
        proxy1.request();
        System.out.println("---------------------");
        proxy2.request();
        
    }
}

通用代码的运行结果如下:

Proxy before...
RealSubject 1 业务逻辑处理...
Proxy after...
---------------------
Proxy before...
RealSubject 2 业务逻辑处理...
Proxy after...

一个代理类可以代理多个被委托者或被代理者,因此一个代理类具体代理那个具体业务类,是由场景决定的。当然,最简单的情况就是一个主题和一个代理类,这是最简洁的代理模式。通常情况下,一个接口只需要一个代理类就可以了,具体代理哪个类由高层决定,也就是代理类构造方法中传递的被代理者。

代理模式的应用

代理模式的优点

代理模式的使用场景

代理模式的使用场景非常多,Spring AOP就是一个典型的动态代理。

《注》以上内容总结自秦小波-《设计模式之禅》,仅为个人学习笔记。

上一篇 下一篇

猜你喜欢

热点阅读