这里说的是静态代理模式,想看动态代理模式可以移步来这篇博文:设计模式_25:动态代理模式
假如今天轮到我做班里的值日,那么代码可以这样写:
public class Main {
public static void main(String[] args) {
Me me = new Me();
me.doDuty();
}
}
interface DoDuty {
void doDuty();
}
class Me implements DoDuty{
@Override
public void doDuty(){
System.out.println("做值日");
}
}
如果有人可以代我做值日,那么代码可以改成这样:
public class Main {
public static void main(String[] args) {
Helper helper = new Helper(new Me());
helper.doDuty();
}
}
interface Doduty {
void doDuty();
}
class Helper implements Doduty {
private Me me;
public Helper(Me me) {
this.me = me;
}
@Override
public void doDuty() {
me.doDuty();
}
}
class Me implements Doduty {
@Override
public void doDuty() {
System.out.println("做值日");
}
}
上面写的就是代理模式,总的来说代理模式是先定义一个RealSubject(Me)和Proxy(Helper)的公共接口Subject(Doduty),Proxy保存一个RealSubject的引用来使得代理可以访问实体。
2018-02-15更新:
感觉我以前写的博文解析太简单了,现在我自己看了也觉写得很不负责任,想再补充一点。
还是拿上面做值日的例子:Helper就是我们所说的代理类,Helper的实例就成为代理对象,代理对象的方法叫做代理方法。那么Me就是被代理的类(也称目标类),Me的实例就是被代理对象(目标对象),Me的实例方法就叫作被代理方法(目标方法)。
我们的Me类和Helper类都实现的DoDuty接口,并且Helper实例里有Me实例的引用,当我们调用Helper的doDuty方法时,实际上执行的是Me对象的doDuty方法。
但其实上面的例子并不能实际体现出代理模式有什么作用,那么如果我们在Helper的doDuty方法里改成这样,就应该可以理解了:
public void doDuty(){
System.out.println("我要帮me做值日!");
me.doDuty();
System.out.println("我帮me做完值日啦~");
}
这样,我们可以在me.doDuty前后添加其他逻辑的代码,但又不会影响me.doDuty方法里的代码逻辑(虽然me.doDuty里的方法也就是输出一行字,但实际开发中里面的代码可以很长很复杂)。