在考慮對象及對象與其他對象的關系時,我們通常會想到繼承這個術語。例如,定義某壹個抽象類— Dog 類。在標識相似的壹些類但每個類又有各自的獨特行為時,通常使用繼承來擴展功能。舉例來說,如果標識了 Poodle,則可以說壹個 Poodle 是壹個 Dog,即 Poodle繼承了 Dog。到此為止都似乎不錯,但是如果定義另壹個以後標識為 Obedient Dog 的獨特行為又會怎樣呢?當然,不是所有的 Dogs 都很馴服,所以 Dog 類不能包含 obedience 行為。此外,如果要創建從 Dog繼承的 Obedient Dog 類,那麽 Poodle 放在這個層次結構中的哪個位置合適呢?Poodle 是壹個 Dog,但是 Poodle 不壹定 obedient;那麽 Poodle 是繼承於 Dog 還是 Obedient Dog 呢?都不是,我們可以將馴服看作壹個方面,將其應用到任何壹類馴服的 Dog,我們反對以不恰當的方式強制將該行為放在 Dog 層次結構中。
在軟件術語中,面向方面的編程能夠獨立於任何繼承層次結構而應用改變類或對象行為的方面。然後,在運行時或編譯時應用這些方面。舉壹個關於AOP的示例,然後進行描述,說明起來比較容易。首先,定義四個關鍵的 AOP 術語,這很重要,因為我將反復使用它們:
接合點 (Joinpoint) — 代碼中定義明確的可識別的點。
切點 (Pointcut) — 通過配置或編碼指定接合點的壹種方法。
通知 (Advice) — 表示需要執行交叉切割動作的壹種方法
混入 (Mixin) — 通過將壹個類的實例混入目標類的實例引入新行為。
為了更好地理解這些術語,可以將接合點看作程序流中定義好的壹點。說明接合點的壹個很好的示例是:在代碼調用壹個方法時,發生調用的那壹點被認為是壹個接合點。切點用於指定或定義希望在程序流中截獲的接合點。切點還包含壹個通知,該通知在到達接合點時發生。因此,如果在壹個調用的特定方法上定義壹個切點,那麽在調用該方法或接合點時,AOP 框架將截獲該切點,同時還將執行切點的通知。通知有幾種類型,但是最常見的情況是將其看作要調用的另壹個方法。在調用壹個帶有切點的方法時,要執行的通知將是另壹個要調用的方法。要調用的這個通知或方法可以是對象中被截獲的方法,也可以是混入的另壹個對象中的方法。我們將在後面進壹步解釋混入。