基于包装者的代理
代理模式,实际上和前一篇的装饰者模式有些相似,实际上都是对既有方法的一些扩展;对于如果实现,两者也是类似的:
- 将被代理(被装饰)的类,作为代理类(装饰类)的构造器参数
- 在构造器中将被代理(被装饰)的类初始化
- 由代理类的方法对被代理类做扩展
package com.git.poan;
/**
* Created by poan on 2018/04/03.
*/
public class ProxyTest {
public static void main(String[] args) {
Clerk clerk = new Clerk(new Boss());
clerk.meeting();
}
}
// 这里节省篇幅,就不把meeting提取到接口让Boss和Clerk去实现了
class Boss {
public void meeting() {
System.out.println("不错不错");
}
}
class Clerk {
private Boss boss;
public Clerk(Boss boss) {
this.boss = boss;
}
public void meeting() {
System.out.println("会议开始:");
for (int i = 0; i < 10; i++) {
System.out.println("!@#$$%^^&*");
}
boss.meeting();
System.out.println("会议结束");
}
}
动态代理
面试问Spring的AOP的,实际上就是一个代理模式,在切面的前后为切面方法做扩展,只不过Spring的AOP用的是动态代理实现的;
- InvocationHandler
可以通过实现Java的InvocationHandler接口,然后invoke方法中会对切面方法做预处理然后调用切面方法 - CGLIB CGLIB则不用实现接口,直接生成切面类的子类字节码(所以切面类不能是final类),动态扩展父类的方法。