15.2.2 OOP实现横切
我们知道OOP在解决横切问题时,有很大局限性,但并不表示不能使用。可以使用它解决一些简单问题或者特定问题,在某时候是非常有价值的,因为引入新的软件和技术支持(AOP)总是有风险的,没有必要因为一些简单问题而引入太大的风险。下面列举了一些常用的、使用面向对象编程解决这类问题的方法。
1.模板方法(Template Method)模式
上例中我们使用了模板方法模式计算onTravel()方法的执行时间,我们发现,它实现了环绕增强。对于极少数方法进行横切是可行的,因为它只能完成对所有子类的onTravel()方法执行时间的计算,如果要针对其他方法也进行计算,需要加入冗余的代码。
2.装饰器(Decorator)模式
其实和模板方法模式一样,解决地也不够彻底,例如我们在讲解装饰器模式时所举的记录(log)的例子,虽然对update操作记录了日志,然而,如果对于其他方法,如delete()方法也要记录日志,我们仍然要加入重复的代码,而且它只能对具有相同接口的对象织入增强。
3.代理(Proxy)模式
和装饰器模式在这方面没有区别。
4.其他模式
如Observer模式等,都只能完成对部分连接点的增强,水平跨度不大,我们在这里就不再赘述。
5.拦截器框架
这个功能比较强大,但是作为一个框架,实现起来并不太容易,具体请参见下节介绍。
OOP可以解决一些AOP问题,但是使用它们终究不够优雅和全面,下面我们来介绍一些常见AOP实现技术。