代理模式简介(七)

一、定义

    为其它对象提供一种代理,以控制对这对象的访问。


二、类图



三、代理三要素

    1.Subject 抽象主题角色(共同接口)

    可以是抽象类或者接口,是一个最普通的业务类型定义,无特殊要求。

public interface Subject {
    //定义一个方法
    public void request();
}

    2.RealSubject 具体主题角色(真实对象)

    也叫被代理角色。是业务逻辑的具体执行者。

public class RealSubject implements Subject {
    //实现方法
    public void request() {
        // TODO 业务逻辑处理
    }
}

    3.Proxy 代理主题角色(代理对象)

    也叫代理类。负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色去实现,并且在真实主题角色处理完毕前后做预处理和善后操作。

public class Proxy implements Subject {
    //要代理哪个实现类
    private Subject subject = null;
    //通过构造函数传递代理者
    public Proxy(Subject subject){
        this.subject = subject;
    }
    //实现接口中定义的方法
    public void request() {
        this.before();
        this.subject.request();
        this.after();
    }
    //预处理
    private void before(){
        //do something
    }
    //善后处理
    private void after(){
        //do something
    }
}

四、优点

    1.职责清晰

    真实角色就是实现实际的业务逻辑,而不需要关心其他非本职工作(例如前处理、后处理),通过代理完成一件事务,结果就是编程简洁清晰。

    2.高扩展性

    具体的主题角色是随时都可能发生变化的,当需要改变时,通过代理类,我们就可以做到不修改原角色下实现扩展。


五、使用场景

    通常用于对原有逻辑进行扩展。比如现在持有二方包的某些类,需要调用其中的某些方法并添加一些方法,例如打印日志等,但是又不方便将这些逻辑直接加在二方包的方法里,那么我们就可以通过使用代理的方式来进行。

    扩展:一方包、二方包、三方包是什么?

       一方包:本工程内的各模块的相互依赖

        二方包:公司内部的依赖库,一般指公司内部的其他项目发布的jar包

        三方包:公司之外的开源库,比如apache、google等发布的依赖

    也许你现在还觉得很郁闷,为什么要使用代理。但是想想现实世界中,打官司为什么要找个律师?因为你不想参与到中间过程的是是非非,只需要完成自己的答辩,其它诸如事前调查、事后追查都由律师来搞定,这就是为了减轻你的负担。


六、扩展

    静态代理和动态代理的介绍,可以参考下一篇博文 静态代理和动态代理


查看更多:设计模式分类以及六大设计原则

猜你喜欢

转载自blog.csdn.net/afei__/article/details/80555456
今日推荐