一.核心作用
- 通过代理,控制对对象的访问;
- 可以详细控制访问某个对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。
二.核心角色
- 抽象角色: 定义代理角色和真实角色的公共对外方法;
- 真实角色: 实现抽象角色,定义真实角色suo’yao实现的业务逻辑,供代理角色调用;
- 代理角色: 实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。将统一的流程控制放到代理角色中处理。
三.应用场景
- 安全代理: 屏蔽对真实角色的直接访问;
- 远程访问: 通过代理类处理远程方法调用;
- 延迟加载: 先加载轻量级的代理对象,真实需要再加载真实对象。
四.分类
- 静态代理: 静态定义代理类
- 动态代理: 动态生成代理类
五.动态代理类生成方式
- JDK自带的动态代理;
- CGLIB实现;
- javaassist字节码操作库实现;
- ASM(底层使用指令,可维护性较差)
六.动态代理相比静态代理的优点
- 抽象角色中声明的所有方法都被转移到调用处理器一个集中的方法中处理,这样,我们可以更新灵活和统一的处理众多的方法。
七.JDK自带的动态代理
- java.lang.reflect.Proxy
-
- 动态生成代理类和对象;
- java.lang.reflect.InvocationHandler
-
- 可以通过invoke方法实现对真实角色的代理访问;
-
- 每次通过Proxy生成代理类对象时都有指定对应的处理器对象
八.举例代码实现
-
例:
- 以金南铃演出为例,假如客户邀请金南玲演出唱歌,要做这些事情:面试、签合同、订票、唱歌、收钱。如果金南玲演出少,那么这些事情她自己就可以干;如果演出多,与每个客户合作她自己都有干这么多事,很繁琐;金南玲她自己主要业务就是唱歌,那么唱歌之前和之后的事都可以交给别人来做,很自然的就产生了经纪人概念。除了唱歌由金南玲本人来做,其它事情都交给经纪人做。这理的经纪人就是我们所说的代理。
-
1.代码实现
-
- 抽象角色类
/*** 抽象角色*/
public interface Star {//面试void confer();//签合同void singContract();//订票void bookTicket();//唱歌void sing();//收尾款void collectMoney();
}
-
- 真实角色类
/*** 真实角色*/
public class RealStar implements Star {@Overridepublic void confer() {System.out.println("面试");}@Overridepublic void singContract() {System.out.println("签合同");}@Overridepublic void bookTicket() {System.out.println("订票");}@Overridepublic void sing() {System.out.println("金南铃本人演唱《逆流成河》");}@Overridepublic void collectMoney() {System.out.println("收钱");}
}
-
- 静态代理——代理角色
/*** 代理角色*/
public class ProxyStar implements Star{private RealStar realstar;public ProxyStar(RealStar realstar) {this.realstar=realstar;}@Overridepublic void confer() {System.out.println("面试");}@Overridepublic void singContract() {System.out.println("签合同");}@Overridepublic void bookTicket() {System.out.println("订票");}@Overridepublic void sing() {realstar.sing();}@Overridepublic void collectMoney() {System.out.println("收钱");}
}
-
- 静态代理——客户调用
/*** 静态代理*/
public static void main(String[] args) {RealStar realstar=new RealStar();ProxyStar proxystar=new ProxyStar(realstar);proxystar.confer();proxystar.singContract();proxystar.bookTicket();proxystar.sing();proxystar.collectMoney();
}
-
- 动态代理——代理角色
/*** 动态代理实现代理模式* 动态代理类 */
public class HandlerStar implements InvocationHandler,Star{private Star star;public HandlerStar(Star star) {this.star = star;}@Overridepublic Object invoke(Object proxy, Method method, Object[] o) throws Throwable {confer();singContract();bookTicket();Object invoke = method.invoke(star, o);collectMoney();return invoke;}@Overridepublic void confer() {System.out.println("代理面试");}@Overridepublic void singContract() {System.out.println("代理签合同");}@Overridepublic void bookTicket() {System.out.println("代理订票");}@Overridepublic void sing() {}@Overridepublic void collectMoney() {System.out.println("代理收钱");}
}
-
- 动态代理——客户调用
/*** 动态代理实现代理模式*/
public static void main(String[] args) {Star star=new RealStar();HandlerStar handler=new HandlerStar(star);Star proxy=(Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class} , handler);proxy.sing();
}
更多设计模式学习:
设计模式(1):介绍
设计模式(2):单例模式
设计模式(3):工厂模式
设计模式(4):建造者模式
设计模式(5):原型模式
设计模式(6):桥接模式
设计模式(7):装饰器模式
设计模式(8):组合模式
设计模式(9):外观模式
设计模式(10):享元模式
设计模式(11):适配器模式
设计模式持续更新中…