什么是代理模式?
有一天,你的妹子需要一个包,为了哄妹子开心,你决定给她买个好一点的包,但是大家都知道,国内的都那么贵,那就去国外或者香港买。最近你又特别忙,没有时间出去,这个时候某个同事有刚好要出去,那你就让他帮忙喽。那么,这整个过程就是一个代理模式了!
这个里面,同事就是代理对象,你就是真实对象,买包就是公共的方法了,为了更好的实现分离,我们还会定义一个接口,定义公共的方法,以减小程序的耦合。代理模式的结构如下:
代理模式的实现
1、创建抽象对象的接口
public interface Sub {
public void buy();
}
2、创建真实对象
public class RealSub implements Sub{
public void buy(){
System.out.println("买一个包!");
}
}
3、创建代理对象类
public class ProxySub implements Sub{
public void buy(){
RealSub realsub = new RealSub();
realsub.buy();
this.need();
}
public void need(){
System.out.println("拿一个channel的包!");
}
}
4、客户端调用
public class ProxyTest {
public static void main(String[] args){
Sub proxysub = new ProxySub();
proxysub.buy();
}
}
运行结果:
为什么需要代理模式?
明明很简单的一个功能,为什么分成这么多来写,完全是增加程序的复杂性啊!但是如果我们的代码量增大,处理的事物逻辑变得复杂,这个时候代理模式能给我们带来很大的方便。它能够让职责更加的清晰,而且具有高拓展性,降低程序的耦合度。
动态代理
静态代理:代理类是在编译时就实现好的。也就是说Java编译完成后,代理类是一个实际的class文件。
动态代理:代理类是在运行时生成的。也就是说Java编译完成后并没有实际的class文件,而是在运行时动态生成的类字节码,并加载到JVM中。
动态代理实现代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxyTest {
public static void main(String[] args){
RealSubject realSubject = new RealSubject();
ProxyHandler handler = new ProxyHandler(realSubject);
Subject proxySubject = (Subject)Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
RealSubject.class.getInterfaces(), handler);
proxySubject.request();
}
}
interface Subject{
void request();
}
class RealSubject implements Subject{
public void request(){
System.out.println("======realSubject Request!=======");
}
}
class ProxyHandler implements InvocationHandler{
private Subject subject;
public ProxyHandler(Subject subject){
this.subject = subject;
}
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
System.out.println("========before=======");
Object result = method.invoke(subject, args);
System.out.println("======after==========");
return result;
}
}
运行结果如上图所示,本文只是简单的让我们对动态代理有一个观感,具体的实现机制,需要另外的专门文章来进行讲解。
总结
代理模式相对来说比较的简单,主要有三个角色:接口、代理对象、真实(委托)对象。在Android的binder通信机制当中就用到代理模式,虽然代理模式有一些优点,但是还有存在一些缺点的,不然就没有其他那些设计模式了。由于在中间增加了一个代理对象,导致有的时候访问的处理请求的速度会变慢,并且代理模式需要额外的工作,会增加实现的复杂度。所以,没有最好的设计模式,只有最合适的设计模式!
参考博客:
https://www.jianshu.com/p/6f6bb2f0ece9
https://www.ibm.com/developerworks/cn/java/j-lo-proxy-pattern/
http://www.runoob.com/design-pattern/proxy-pattern.html