AOP(Aspect-Oriented Programming,面向方面編程),可以說是OOP(Object-Oriented Programing,面向對象編程)的補充和完善。OOP引入封裝、繼承和多態性等概念來建立1種對象層次結構,用以摹擬公共行動的1個集合。
當我們需要為分散的對象引入公共行動的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關系,但其實不合適定義從左到右的關系。例如日志功能。日志代碼常常水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。對其他類型的代碼,如安全性、異常處理和透明的延續性也是如此。這類 散布在各處的無關的代碼被稱為橫切(cross-cutting)代碼,在OOP設計中,它致使了大量代碼的重復,而不利于各個模塊的重用。
而AOP技術則恰恰相反,它利用1種稱為“橫切”的技術,剖解開封裝的對象內部,并將那些影響了多個類的公共行動封裝到1個可重用模塊,并將其名為 “Aspect”,即方面。所謂“方面”,簡單地說,就是將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任封裝起來,便于減少系統的重復代碼,下降模塊間的耦合度,并有益于未來的可操作性和可保護性。AOP代表的是1個橫向的關系,如果說“對象”是1個空心的圓柱體,其中封裝的是對象的屬性和行動; 那末面向方面編程的方法,就恍如1把利刃,將這些空心圓柱體剖開,以取得其內部的消息。而剖開的切面,也就是所謂的“方面”了。然后它又以巧奪天功的妙手 將這些剖開的切面復原,不留痕跡。就像下面的效果圖,業務線走業務線,切面走切面,他們完好的結合在1起。
圖解:
業務線:圖中的紫色豎條。
服務類:圖中的綠色橫條。
服務類:像日志,權限,緩沖等跟具體的業務流程沒有關系,沒有這些服務,系統也能夠正常運轉,但是可以切入到每條業務線的某1個部份,增強業務線的功能,例如加入 日志后,可以分析日志,優化系統,或通過日志發現系統運行時毛病。