核心作用:
通过代理,控制对对象的访问
可以详细控制某个对象的方法,在调用这个方法做前置处理,调用这个方法后做后置处理(AOP的微观实现)
AOP(Aspect Oriented Programming)
面向切面编程的核心实现机制
核心角色:
抽象角色:定义代理角色和真实角色的公共对外方法
真实角色:实现抽象角色,定义真实角色索要实现的业务逻辑,供代理角色调用(关注真正的业务逻辑)
代理角色:实现抽象角色,是真实的角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作(将统一的流程控制放到代理角色中进行处理)
应用场景:
安全代理:屏蔽对真实角色的直接访问
远程代理:通过代理类处理远程方法调用(RMI)
延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象
分类:
静态代理:静态定义代理类
动态代理:动态生成代理类
jdk自带的动态代理
javaassist字节码操作库实现
CGLIB
ASM(底层使用指令)
举例:
歌手唱歌
package com.littlepage.ProxyParttern; public interface Star { //面谈 void confer(); //签合同 void signContract(); //订票 void bookTicket(); //唱歌 void sing(); //收钱 void collectMoney(); }
package com.littlepage.ProxyParttern; public class ProxyStar implements Star{ private Star star; public ProxyStar(Star star) { super(); this.star = star; } @Override public void confer() { System.out.println("Proxy Star Confer"); } @Override public void signContract() { System.out.println("Proxy Star SignContract"); } @Override public void bookTicket() { System.out.println("Proxy Star BookTicket"); } @Override public void sing() { star.sing(); } @Override public void collectMoney() { System.out.println("Proxy Star CollectMoney"); } }
package com.littlepage.ProxyParttern; public class RealStar implements Star{ @Override public void confer() { System.out.println("Real Star Confer"); } @Override public void signContract() { System.out.println("Real Star SignContract"); } @Override public void bookTicket() { System.out.println("Real Star BookTicket"); } @Override public void sing() { System.out.println("Real Star Sing"); } @Override public void collectMoney() { System.out.println("Real Star CollectMoney"); } }
package com.littlepage.ProxyParttern; public class Client { public static void main(String[] args) { RealStar rs=new RealStar(); ProxyStar ps=new ProxyStar(rs); ps.confer(); ps.signContract(); ps.bookTicket(); ps.sing(); } }