婷婷,我把对AOP的看法慢慢的写给你,你把这些资料收集好,今后会用到。
首先,你不要怕AOP,AOP本质上是一种思想,是没有具体形态的想法,因为现在并不是很成熟,所以不是太多的人了解。人对未知领域都是很惧怕的,其实如果惧怕,则会加大掌握它的难度,如果能用正常心态的一点一点理解,并不会比学其他的什么知识更难。
先给你做个铺垫,编程思想的发展,历史上只有一次极大的飞跃,就是结构化(SP,Structure Programming)到面向对象(OOP,Object Oriented Programming)的思维方式。拿写日记作为场景来对比这两种思想。SP就像是记流水帐,当天气温多少度,几点钟分别在做什么,都顺序写下。这样做的好处是逻辑简单,也不用组织什么语言,按时间进度的方式就能记下一天的日记,今后查阅也很直观,什么时间在干什么一目了然。映射到编程思想里,就是最开始出现的SP。把你想做的事情安排好,一并发给机器。C语言就是典型的结构化语言,你把想做的事情用C来描述(用C来写代码),然后发给机器执行。当然,源代码是不能直接被机器所理解的,还要预先通过编译器编译成机器能看懂的二机制代码。C语言编译器所编译出来的代码,通常都很简单,机器执行的时候不需要走什么弯路(什么是弯路?继续看下去你就会明白)。然而,一个软件,并不是运行速度越快就越好,效率只是一个方面,我觉得,效率只要在一个可以接受的范围之内就行了。比如说启动一个文件编辑软件,需要10分钟的话,那必然超出了人能接受的范围。但如果是1秒钟,我想人是可以接受的,没有必要非要搞到0.01秒内。好的软件,更应该看重和客户需求的匹配度,可扩展性,伸缩性,可维护性。恰恰这些是SP的弱点,因为它太直接了,一切都被计划的很死,想更改一下流程,那可以重新做一个新的了,而且支持SP的语言(C),都是直接操作数据,程序做的事情就是不停的按照流程处理数据,这也是C快的原因。人们一直设法解决这个问题,OOP才出现了。同样是写日记,OOP不会告诉你今天气温到底是几度,它会写道今天阳光明媚,如果想知道具体温度,请打个电话给气象台的小姐。OOP强调对象的概念,现实世界中的东西很容易就能建立起对象模型,编了那么多Java程序,你肯定明白这个,我也不多说了。更重要的是,OOP中的“依赖倒转”等等最基本的原则,给编程带来了极大的灵活性。这个我也给你讲过很多了,不多说了。结合设计模式(Design Pattern),可以更好的组织OOP系统中的对象间的关系,降低耦合度,提高复用性。复用,就是重复利用一些现有的功能,比如说Struts的功能就是在web中分离业务和表现,你想要复用它这个功能,只需要做一些符合Struts所约定的规范即可(用ActionServlet做入口,实现Action接口等)。然而这种复用的方式并不优雅,正如上面所提到的,要复用它的功能,必须要去实现它所定义出来的接口。我自己把这种编程模型叫做“插座-插头模型”,插头还是要插入插座的。人们继续寻找更优雅的解决方案,AOP似乎就是解决之道,我把AOP的编程模型叫做“小球-杯子模型”,想要获得杯子的功能,把小球放进杯子就行,不想要杯子提供的功能了,就从杯子里拿出来,小球还是小球。读到这里,你能体会到小球和插头的不同吗?现在告诉你它们唯一的不同点,插头要插入插孔,必须做金属引脚,也就是说它身体的一部分是专门为了插座而做的,这部分和它自身需要完成的业务一点关系也没有(违反单一职责原则);而小球不需要在身上加个和自己业务功能不相干的部件去匹配杯子。这就是AOP想要达到的目的。