android设计模式二十三式(八)——代理模式(Proxy)

代理模式

代理模式,看起来非常像装饰器模式。

对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个 接口。对代理模式来说,代理类(proxy class)和真实处理的类(real class)也都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。

然而,实际上,在装饰器模式和代理模式之间还是有很多差别的。装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。  

代理,偏重因自己无法完成或自己无需关心,需要他人干涉事件流程,更多的是对对象的控制。
装饰,偏重对原对象功能的扩展,扩展后的对象仍是是对象本身。

代理模式,注重对对象某一功能的流程把控和辅助。它可以控制对象做某些事,重心是为了借用对象的功能完成某一流程,而非对象功能如何。
装饰模式,注重对对象功能的扩展,它不关心外界如何调用,只注重对对象功能的加强,装饰后还是对象本身。

对于代理类,如何调用对象的某一功能是思考重点,而不需要兼顾对象的所有功能;
对于装饰类,如何扩展对象的某一功能是思考重点,同时也需要兼顾对象的其它功能,因为再怎么装饰,本质也是对象本身,要担负起对象应有的职责。

依旧我们来举个例子,好理解一下,小明想要出国去旅游,但是呢,小明是第一次,所以,对整个流程都不熟悉,需要一个人来帮他来完成这些事情,所以就找了一家旅游公司,那么这个旅游公司呢,就是这个代理了,在小明出国旅游之前,就确定了是小明与旅游公司的关系。

看一下代码

/**
 * @author: hx
 * @Time: 2019/5/13
 * @Description: People
 */
public interface People {
    /**
     * 人们都可以去旅游
     */
    void travelling();
}

/**
 * @author: hx
 * @Time: 2019/5/13
 * @Description: Xiaoming
 */
public class Xiaoming implements People {
    @Override
    public void travelling() {
        System.out.println("小明去旅游");
    }
}

/**
 * @author: hx
 * @Time: 2019/5/13
 * @Description: TravelAgency
 */
public class TravelAgency implements People {
    private Xiaoming mXiaoming;

    public TravelAgency() {
        mXiaoming = new Xiaoming();
    }

    @Override
    public void travelling() {
        beforeTravel();
        mXiaoming.travelling();
        afterTravel();
    }

    /**
     * 旅游前的事情
     */
    private void beforeTravel(){
        System.out.println("办证");
        System.out.println("买机票");
        System.out.println("买保险");
        System.out.println("找导游");
    }
    /**
     * 旅游后的事情
     */
    private void afterTravel(){
        System.out.println("返程机票");
    }
}

小明出去旅个游:

public static void main(String[] args){
    People agency = new TravelAgency();
    agency.travelling();
}

输出结果:
办证
买机票
买保险
找导游
小明去旅游
返程机票

采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。

使用代理模式,可以将功能划分的更加清晰,有助于后期维护!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章