核心作用
通过代理,控制对对象的访问。
可以详细控制某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理(AOP面向切面的微观实现),从而将统一流程放到代理类中处理。
核心角色
抽象角色:定义代理角色和真实角色的公共对外方法。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色使用。
代理角色:实现抽象角色,是真实角色的代理(即,持有对真实角色的引用),通过真实角色的业务逻辑来实现抽象方法,可以附加自己的操作。
分类
静态代理:静态定义代理类
动态代理:动态生成代理类
静态代理的实现
以明星唱歌为例,假设流程如下:面谈——签合同——订票——唱歌(明星本人)——收款
1.定义抽象角色
package Proxy.staticProxy; /** * 抽象角色:定义代理角色和真实角色的公共对外方法 * @author baka * */ public interface Star { /** * 面谈 */ public void confer(); /** * 签合同 */ public void signContract(); /** * 订票 */ public void bookTicket(); /** * 唱歌 */ public void sing(); /** * 收款 */ public void collectMoney(); }
2.定义真实角色
真实角色真正要做的事情就是唱歌
package Proxy.staticProxy; /** * 真实角色 * 实现抽象角色,定义真实角色所要实现的业务逻辑 * @author baka * */ public class RealStar implements Star{ @Override public void confer() { } @Override public void signContract() { } @Override public void bookTicket() { } @Override public void sing() { System.out.println("周杰伦本人唱歌!"); } @Override public void collectMoney() { } }
3.定义代理角色
package Proxy.staticProxy; /** * 代理角色 * 实现抽象角色,并且持有真实角色的引用 * 处理统一的控制流程 * @author baka * */ public class ProxyStar implements Star{ private Star star; public ProxyStar(Star star) { super(); this.star = star; } @Override public void confer() { System.out.println("面谈"); } @Override public void signContract() { System.out.println("签合同"); } @Override public void bookTicket() { System.out.println("订票"); } /** * 唱歌只能由真实角色来做 */ @Override public void sing() { star.sing(); } @Override public void collectMoney() { System.out.println("收尾款"); } }
4.测试
public class Client { public static void main(String[] args) { Star real = new RealStar(); //代理角色持有真实对象的引用 Star proxy = new ProxyStar(real); proxy.confer(); proxy.signContract(); proxy.collectMoney(); proxy.sing(); proxy.collectMoney(); } }
5.运行结果
我们可以看到,只有唱歌是由明星本人做的,其他事情都是代理角色做的。
未完,待续。。。