代理模式:为其他对象提供一种代理以控制对这个对象的访问。说白了就是"真实对象"的代表,在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途。
代理,可以理解为 我们生活中的代购、律师、中介。把对象不必要的步骤交给其他对象来做,使本对向更加专注的完成某项工作。
假如我要去打水,我的目的是获得水,但是必须需要一个桶来装水,桶是我不关心的,但是必须要有,
代码实例:
- 我先定义一个接口,有开始工作的方法
package proxy;
interface IAction {
public void action();
}
- 定义一个用户类来实现这个结口
package proxy;
public class UserAction implements IAction{
public void action() {
System.out.println("用户开始工作了");
}
}
- 这时老板想知道你工作持续了多长时间,而你正在废寝忘食的工作,这时老板找来了一个代理,来记录你工作的时间,定义代理类
package proxy;
public class ActionProxy implements IAction{
private IAction target; //声明被代理的对象(范围越大越好,所谓的多态)
//创建一个构造方法
public ActionProxy(IAction target) {
this.target = target;
}
// 实现抽象方法
public void action() {
long startTime = System.currentTimeMillis(); //定义开始的时间戳
target.action();
long endTime = System.currentTimeMillis(); //定义结束的时间戳
System.out.println("共耗时"+(endTime-startTime));
}
}
- 测试类
package proxy;
public class Test {
public static void main(String[] args) {
IAction user = new ActionProxy(new UserAction());
user.action();
}
}
这时我们再来回顾一下定义:为其他对象提供一种代理以控制对这个对象的访问。
和python的装饰器类似,可以扩展不同的功能,但是比装饰器功能更强大,他还可以限制对象的访问,比如上面的代理类中,记录用户执行时间时 再加入一个用户验证 ,只有通过验证的员工才可以真正的访问。
类与接口的组合,和模板方法设计模式类似,但侧重点不一样,静态代理模式更专注与控制。