代理模式
代理模式,看起来非常像装饰器模式。
对装饰器模式来说,装饰者(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();
}
输出结果:
办证
买机票
买保险
找导游
小明去旅游
返程机票
采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
使用代理模式,可以将功能划分的更加清晰,有助于后期维护!