面向切面編程(AOP是Aspect Oriented Program的首字母縮寫(xiě)) 忌警,我們知道肌毅,面向?qū)ο蟮奶攸c(diǎn)是繼承、多態(tài)和封裝蔚万。而封裝就要求將功能分散到不同的對(duì)象中去,這在軟件設(shè)計(jì)中往往稱(chēng)為職責(zé)分配临庇。實(shí)際上也就是說(shuō)笛坦,讓不同的類(lèi)設(shè)計(jì)不同的方法区转。這樣代碼就分散到一個(gè)個(gè)的類(lèi)中去了。這樣做的好處是降低了代碼的復(fù)雜程度版扩,使類(lèi)可重用废离。
但是人們也發(fā)現(xiàn),在分散代碼的同時(shí)礁芦,也增加了代碼的重復(fù)性蜻韭。什么意思呢?比如說(shuō)柿扣,我們?cè)趦蓚€(gè)類(lèi)中肖方,可能都需要在每個(gè)方法中做日志。按面向?qū)ο蟮脑O(shè)計(jì)方法未状,我們就必須在兩個(gè)類(lèi)的方法中都加入日志的內(nèi)容俯画。也許他們是完全相同的,但就是因?yàn)槊嫦驅(qū)ο蟮脑O(shè)計(jì)讓類(lèi)與類(lèi)之間無(wú)法聯(lián)系司草,而不能將這些重復(fù)的代碼統(tǒng)一起來(lái)艰垂。
也許有人會(huì)說(shuō),那好辦啊埋虹,我們可以將這段代碼寫(xiě)在一個(gè)獨(dú)立的類(lèi)獨(dú)立的方法里猜憎,然后再在這兩個(gè)類(lèi)中調(diào)用。但是搔课,這樣一來(lái)胰柑,這兩個(gè)類(lèi)跟我們上面提到的獨(dú)立的類(lèi)就有耦合了,它的改變會(huì)影響這兩個(gè)類(lèi)爬泥。那么柬讨,有沒(méi)有什么辦法,能讓我們?cè)谛枰臅r(shí)候袍啡,隨意地加入代碼呢踩官?這種在運(yùn)行時(shí),動(dòng)態(tài)地將代碼切入到類(lèi)的指定方法葬馋、指定位置上的編程思想就是面向切面的編程卖鲤。
一般而言肾扰,我們管切入到指定類(lèi)指定方法的代碼片段稱(chēng)為切面畴嘶,而切入到哪些類(lèi)、哪些方法則叫切入點(diǎn)集晚。有了AOP窗悯,我們就可以把幾個(gè)類(lèi)共有的代碼,抽取到一個(gè)切片中偷拔,等到需要時(shí)再切入對(duì)象中去蒋院,從而改變其原有的行為亏钩。
這樣看來(lái),AOP其實(shí)只是OOP的補(bǔ)充而已欺旧。OOP從橫向上區(qū)分出一個(gè)個(gè)的類(lèi)來(lái)姑丑,而AOP則從縱向上向?qū)ο笾屑尤胩囟ǖ拇a。有了AOP辞友,OOP變得立體了栅哀。如果加上時(shí)間維度,AOP使OOP由原來(lái)的二維變?yōu)槿S了称龙,由平面變成立體了留拾。從技術(shù)上來(lái)說(shuō),AOP基本上是通過(guò)代理機(jī)制實(shí)現(xiàn)的鲫尊。
AOP在編程歷史上可以說(shuō)是里程碑式的痴柔,對(duì)OOP編程是一種十分有益的補(bǔ)充。