我将从最基础的原始代码–>使用设计模式(装饰器模式与代理)–>使用AOP三个层次来讲解一下我们使用AOP的好处,希望这篇文章可以对大家有益。
原始代码的写法
既然要通过代码来演示,那必须要有例子,这里我的例子为:
有一个接口Dao有insert、delete、update三个方法,在insert与update被调用的前后,打印调用前的毫秒数与调用后的毫秒数
首先定义一个Dao接口:
public interface Dao {
public void insert();
public void delete();
public void update();
}
然后定义一个实现类DaoImpl:
public class DaoImpl implements Dao {
@Override
public void insert() {
System.out.println("DaoImpl.insert()");
}
@Override
public void delete() {
System.out.println("DaoImpl.delete()");
}
@Override
public void update() {
System.out.println("DaoImpl.update()");
}
}
最原始的写法,我要在调用insert()与update()方法前后分别打印时间,就只能定义一个新的类包一层,在调用insert()方法与update()方法前后分别处理一下,新的类我命名为ServiceImpl,其实现为:
public class ServiceImpl {
private Dao dao = new DaoImpl();
public void insert() {
System.out.println("insert()方法开始时间:" + System.currentTimeMillis());
dao.insert();
System.out.println("insert()方法结束时间:" + System.currentTimeMillis());
}
public void delete() {
dao.delete();
}
public void update() {
System.out.println("update()方法开始时间:" + System.currentTimeMillis());
dao.update();
System.out.println("update()方法结束时间:" + System.currentTimeMillis());
}
}
这是最原始的写法,这种写法的缺点也是一目了然:
方法调用前后输出时间的逻辑无法复用,如果有别的地方要增加这段逻辑就得再写一遍
如果Dao有其它实现类,那么必须新增一个类去包装该实现类,这将导致类数量不断膨胀
使用装饰器模式
接着我们使用上设计模式,先用装饰器模式,看看能解决多少问题。装饰器模式的核心就是实现Dao接口并持有Dao接口的引用,我将新增的类命名为LogDao,其实现为:
public class LogDao implements Dao {
private Dao dao;
public LogDao(Dao dao) {
this.dao = dao;
}
@Override
public void insert() {
System.out.println("insert()方法开始时间:" + System.currentTimeMillis());
dao.insert();
System.out.println("insert()方法结束时间:"</