AOP设计模式之-- 布谷鸟蛋
【IT168 技术文档】最近较多的看了些AOP方面的东西,AOP的给设计和开发带来的好处就不用我多说. 套用一句广告词, 谁用谁知道... :-)
在OO的世界里有大量的设计模式,这些设计模式就象围棋中的定式,到这样的局面就要这样下,一定是对的,除非你真的是大国手了,可以自己创造定式,但国手大师不是每个人都能当的,所以我们就先理解模式,用好模式吧.
AOP的世界里也有自己特有的设计模式,有人用AOP把OO的经典设计模式都重实现了一遍,其中一部分也有很好的效果,这些资料网上有很多,我在这里不想介绍这些,我介绍的是AOP特有的设计模式,虽然现在AOP还没有被广泛的大量使用,但已经有老外的牛人总结出来了若干个AOP设计模式出来,在这里我先介绍 AOP设计模式中的布谷鸟蛋(Cuckoo's Egg), 下面的介绍中使用aspectJ,如果你没有AOP, aspectJ的基础知识,建议先你找找这方面的文章看看.
首先说说要解决的问题: 你一个class通过构造函数创建instance,但有一天你的业务逻辑变了,你想让这个构造函数返回一个能包含另一业务逻辑的class的instance.原理图如下: CuckoosEggAspect : 用来切入OriginalClass 的构造函数,使其返回一个ReplacementClass的instance SharedInterface : 共同的interface OriginalClass : 老的类,原有业务逻辑 ReplacementClass :替代累,新的业务逻辑 MainApplication :主应用,调用你实现的业务逻辑思维 看明白了吗,在OO里,这种情况通常用factory的方式来解决,但用了AOP的解决方法可以更灵活和更强大. 其中OriginalClass 和ReplacementClass 都实现SharedInterface 也不是必须的,ReplacementClass 也可以是OriginalClass 的子类,或他们都继承一个抽象类,关键是实例化后返回的对象类型正确就可以了.如果你原来的代码中没有使用factory的方法,面对逻辑的改变,不需要改动原来的代码,只需要增加一个切面就可以了,这样可以解决是不是可以避免很多问题. 回过头来,第一次读到相关资料的时候我还不理解这个设计模式的名字,为什么叫Cuckoo's Egg, 翻译成中文名字-布谷鸟蛋的时候也很犹豫,仔细一想明白了,布谷鸟经常把自己的蛋放到别的鸟窝里,这样别的鸟用同样的方式把小鸟孵化(实例化)出来的时候,孵化出来的竟然是布谷鸟的孩子(实例). 布谷鸟蛋,老外取的名字很形象也很有幽默感. 今天先写到这里,以后会给大家介绍更多的AOP特有的设计模式.
