作为aop的实现技术支持,代理模式应该是最被人熟知的,代理模式用大白话来说,类似一个中介,可以进行方法的增强或者修改(Ps:我觉得静态代理模式和命令模式好像,命令模式也可以在具体命令类里调用接收者前后进行环绕增强,只不过无法修改方法只能进行拓展)
当我们不方便直接调用一个类的时候 可以使用代理模式,直接看代码吧
公共特征类
public interface Animal { void eat(); }
具体实现类
public class Dog implements Animal { @Override public void eat() { System.out.println("小狗要吃饭"); } }
代理类
public class DogProxy implements Animal{ Dog dog; @Override public void eat() { //执行之前的操作 System.out.println("吃饭前的准备"); dog.eat(); //执行之后的操作 System.out.println("吃饭后"); } public DogProxy(Dog dog) { this.dog = dog; } }
测试类
public class Client { public static void main(String[] args) { new DogProxy(new Dog()).eat(); } }
这种代理模式的缺点就是 每增加一个具体实现类 都要增加一个代理类,这种代理也叫静态代理,是一种在编译期就确定好的代理方式
还有另一种通过反射来进行代理的方式,叫动态代理。这两种代理方式都需要被代理类实现接口,代理类实现与代理类的统一接口以便修改方法。还有另一种技术字节码代理,常见的有cglib和asm。
代理类的核心就是创建代理类代理原类进行执行,因为实现了同一接口可以更方便的修改和增强。