代理模式:
核心作用:通过代理控制对对象的访问,可以详细访问某个对象的方法,在调用这个方法前置处理,调用这个方法后做后置处理。
抽象角色:定义角色代理和真实角色的公共对外方法。
真实角色:实现抽象角色,定义真实角色所需要的实现的业务逻辑,供代理角色调用。 关注真正的业务逻辑!
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的代理的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 将统一的流程控制放到代理角色中处理。
安全代理:屏蔽对真实角色的直接访问。
远程代理:通过代理类处理远程方法调用(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动态代理的解释:
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(); }}
运行结果:
售票
面谈签合同明星唱歌收钱