代理模式
代理模式是工作中很重要的一个角色,相信大家对aop已经不再陌生,这里我举个例子 假设很多人都找周杰伦唱歌.他需要
1.面谈
2.合同起草
3.签字,收预付款
4.安排机票
5.唱歌
6.收尾款
那么如果有很多人都要去找周杰伦唱歌,那么周杰伦就忙不过来了.这个时候他找一个经济人来帮他把重复的工作做了.那么他就只需要唱歌就好了.这就是我们所谓的代理模式
应用场景
1.安全代理:屏蔽对真实对象的访问
2.延迟加载.你获取到的是一个代理对象.真正用的时候才会使用真正的角色
分类:
静态代理(静态定义代理类)
动态代理(动态生成代理类)
- jdk自带的动态代理
- javaassits 字节码操作库实现
- CGlib实现动态代理
- ASM(底层使用指令.,可维护性比较差)
实现demo
静态代理:

public class RealStar implements Star { public void confer() { System.out.println("RealStar.confer"); } public void signContract() { System.out.println("RealStar.signContract"); } public void sing() { System.out.println("周杰伦唱歌..."); } public void collect() { System.out.println("RealStar.collect"); } } public interface Star { void confer(); void signContract(); void sing(); void collect(); } public class StarAdapter implements Star{ private Star star; public StarAdapter(Star star) { this.star = star; } public void confer() { System.out.println("StarAdapter.confer"); } public void signContract() { System.out.println("StarAdapter.signContract"); } public void sing() { star.sing(); } public void collect() { System.out.println("StarAdapter.collect"); } } public class Client { public static void main(String[] args) { Star realStar = new RealStar(); StarAdapter adapter = new StarAdapter(realStar); adapter.confer(); adapter.signContract(); adapter.sing(); adapter.collect(); } }
静态代理类用的不多.主要是使用动态代理
动态代理
/** * @Created by xiaodao * 接口 */ public interface Star { void confer(); void signContract(); void sing(); void collectMoney(); }
/** * @Created by xiaodao * 接口实现类... */ public class RealStar implements Star { public void confer() { System.out.println("RealStar.confer"); } public void signContract() { System.out.println("RealStar.signContract"); } public void sing() { System.out.println("本人唱歌"); } public void collectMoney() { System.out.println("RealStar.collectMoney"); } }
/** * @Created by xiaodao * * */ public class StarHandler implements InvocationHandler { private Star star; public StarHandler(Star star) { this.star = star; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { method.invoke(star,args); if (method.getName().equals("sing")){ System.out.println("本人唱歌要加钱"); } return null; } }
public class Client { public static void main(String[] args) { Star star = new RealStar(); StarHandler handler = new StarHandler(star); Star proxyInstance =(Star)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[]{Star.class},handler); proxyInstance.sing(); proxyInstance.collectMoney(); } }
类图
类图中没有显示.main方法中的proxy类.大家理解下就好.
JDK自带的动态代理
– java.lang.reflect.Proxy
• 作用:动态生成代理类和对象
– java.lang.reflect.InvocationHandler(处理器接口)
• 可以通过invoke方法实现对真实角色的代理访问。
• 每次通过Proxy生成代理类对象对象时都要指定对应的处理器对象