设计模式——代理模式
代理模式:
核心作用:通过代理控制对对象的访问,可以详细访问某个对象的方法,在调用这个方法前置处理,调用这个方法后做后置处理。
抽象角色:定义角色代理和真实角色的公共对外方法。
真实角色:实现抽象角色,定义真实角色所需要的实现的业务逻辑,供代理角色调用。 关注真正的业务逻辑!
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的代理的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 将统一的流程控制放到代理角色中处理。
安全代理:屏蔽对真实角色的直接访问。
远程代理:通过代理类处理远程方法调用(RMI)
延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象。
分类: 静态代理 动态代理
应用:
JDK自带的动态代理
javaassist字节码操作
CGLIB(Code Generation Library)库的实现
ASM(汇编底层使用指令,可维护性较差)
静态代理的Demo:
package com.wxisme.staticproxy; /** * 静态代理 * @author Administrator * */ public interface Star { void confer(); void signContract(); void sellTicket(); void sing(); void collectMoney(); } class RealStar implements Star { @Override public void sellTicket() { System.out.println("售票"); } @Override public void collectMoney() { System.out.println("收钱"); } @Override public void confer() { System.out.println("面谈"); } @Override public void signContract() { System.out.println("签合同"); } @Override public void sing() { System.out.println("明星唱歌"); } } class ProxyStar implements Star { private Star star; public ProxyStar(Star star) { this.star = star; } @Override public void sellTicket() { System.out.println("售票"); } @Override public void collectMoney() { System.out.println("收钱"); } @Override public void confer() { System.out.println("面谈"); } @Override public void signContract() { System.out.println("签合同"); } //调用真实角色的方法 @Override public void sing() { star.sing(); } } package com.wxisme.staticproxy; public class Client { public static void main(String[] args) { Star realStar = new RealStar(); Star proxy = new ProxyStar(realStar); proxy.confer(); proxy.signContract(); proxy.sellTicket(); proxy.sing(); proxy.collectMoney(); } }
运行结果:
面谈
签合同
售票
明星唱歌
收钱
把静态代理改成动态代理:
可以参考一下大神对Java动态代理的解释:http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html
http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html
package com.wxisme.dynamicproxy; public interface Star { void confer(); void signContract(); void sellTicket(); void sing(); void collectMoney(); } class RealStar implements Star { @Override public void sellTicket() { System.out.println("售票"); } @Override public void collectMoney() { System.out.println("收钱"); } @Override public void confer() { System.out.println("面谈"); } @Override public void signContract() { System.out.println("签合同"); } @Override public void sing() { System.out.println("明星唱歌"); } } import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class StarHandler implements InvocationHandler { private Star realStar; public StarHandler(Star realStar) { super(); this.realStar = realStar; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = null; //可以进行一系列的流程控制。 System.out.println("售票"); System.out.println("面谈"); System.out.println("签合同"); if(method.getName().equals("sing")) { obj = method.invoke(realStar, args); } System.out.println("收钱"); return obj; } } package com.wxisme.dynamicproxy; import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { Star realStar = new RealStar(); StarHandler handler = new StarHandler(realStar); Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler); proxy.sing(); } }
运行结果:
售票
面谈
签合同
明星唱歌
收钱
作者:Pickle
声明:对于转载分享我是没有意见的,出于对博客园社区和作者的尊重一定要保留原文地址哈。
致读者:坚持写博客不容易,写高质量博客更难,我也在不断的学习和进步,希望和所有同路人一道用技术来改变生活。觉得有点用就点个赞哈。