原因是采用代理模式可以有效的将具体的实现与调用方进行解耦,通过面向接口进行编码完全将具体的实现隐藏在内部。
通过代码,来大概感受下两种代理的不同。
(1)静态代理:
public class StaticPRoxy { public static void main(String[] args) { SuperMan superMan = new StaticProxy().new SuperMan(); StaticProxyClass staticProxyClass = new StaticProxy().new StaticProxyClass(superMan); staticProxyClass.fly(); }//业务接口interface Human{ public void info(); public void fly();}//纯业务接口的实现类class SuperMan implements Human{ @Override public void info() { System.out.println("我是超人"); } @Override public void fly() { System.out.println("我会飞"); } }class HumanUtil{ public void method1(){ System.out.println("-------开始--------"); } public void method2(){ System.out.println("-------结束--------"); }}//静态代理类(在纯业务基础上增加附加业务)class StaticProxyClass implements Human{ Human human; HumanUtil humanUtil = new HumanUtil(); public StaticProxyClass(Human human){ this.human = human; } @Override public void info() { humanUtil.method1(); human.info(); humanUtil.method2(); } @Override public void fly() { humanUtil.method1(); human.fly(); humanUtil.method2(); }}}(2)动态代理模式:public class DynamicProxy { public static void main(String[] args) { SuperMan superMan = new SuperMan(); DynamicProxyClass dynamicProxyClass = new DynamicProxyClass(); Object object = dynamicProxyClass.getObject(superMan); Human human = (Human) object; human.info(); System.out.println("====================="); human.fly(); }}//业务接口interface Human{ public void info(); public void fly();}//纯业务接口的实现类class SuperMan implements Human{ @Override public void info() { System.out.println("我是超人"); } @Override public void fly() { System.out.println("我会飞"); } }class HumanUtil{ public void method1(){ System.out.println("-------开始--------"); } public void method2(){ System.out.println("-------结束--------"); }}class DynamicProxyClass implements InvocationHandler{ Object obj; HumanUtil humanUtil = new HumanUtil(); public Object getObject(Object obj){ this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { humanUtil.method1(); Object returnValue = method.invoke(obj, args); humanUtil.method2(); return returnValue; } }
新闻热点
疑难解答