自己寫架構筆記(5)----面向切面編程簡述

1、面向切面編程的概念?

百度百科中的概念:

Aspect Oriented Programming(AOP),面向切面編程。
AOP主要實現的目的是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。

簡單的一句話:

在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。再簡單點,就是:運行期間,攔截方法,織入新功能點,增強類。

爲什麼需要AOP?

面向對象的特點是繼承、多態和封裝。
而封裝就要求將功能分散到不同的對象中去,這在軟件設計中往往稱爲職責分配。
實際上也就是說,讓不同的類設計不同的方法。
這樣代碼就分散到一個個的類中去了。
這樣做的好處是降低了代碼的複雜程度,使類可重用。
但是人們也發現,在分散代碼的同時,也增加了代碼的重複性。
什麼意思呢?比如說,我們在兩個類中,可能都需要在每個方法中做日誌。按面向對象的設計方法,我們就必須在兩個類的方法中都加入日誌的內容。也許他們是完全相同的,但就是因爲面向對象的設計讓類與類之間無法聯繫,而不能將這些重複的代碼統一起來。 也許有人會說,那好辦啊,我們可以將這段代碼寫在一個獨立的類獨立的方法裏,然後再在這兩個類中調用。
但是,這樣一來,這兩個類跟我們上面提到的獨立的類就有耦合了,它的改變會影響這兩個類。
那麼,有沒有什麼辦法,能讓我們在需要的時候,隨意地加入代碼呢?
這種在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。
一般而言,我們管切入到指定類指定方法的代碼片段稱爲切面,
而切入到哪些類、哪些方法則叫切入點。有了AOP,我們就可以把幾個類共有的代碼,抽取到一個切片中,等到需要時再切入對象中去,從而改變其原有的行爲。

2、圖示AOP

我們先看一下一張傳統的銀行取款的流程圖:

我們先把驗證用戶的框簡單的合成一個,然後這個時候我們在看一個銀行系統中的查詢餘額流程圖:

我們這個時候,可以發現這兩個流程圖裏,有一個共同的框,那就是這兩個框都要去“驗證身份”這個步驟,我們圈出來:

那我們可以考慮一下,將這個驗證用戶的部分提取出來,然後去在其他的地方封裝起來,然後每次在寫這個流程的時候,將其拿過來使用,這就是AOP的作用了,有了AOP,你寫代碼時不要把這個驗證用戶步驟寫進去,即完全不考慮驗證用戶,你寫完之後,在另外一個地方,寫好驗證用戶的代碼。
這裏還是兩個地方,如果你有多個控制流呢,這個寫代碼的方法可以大大減少你的時間,不過AOP的目的不是這樣,這只是一個“副作用”,真正目的是,你寫代碼的時候,事先只需考慮主流程,而不用考慮那些不重要的流程。
舉一個通用的例子,經常在debug的時候要打log吧,你也可以寫好主要代碼之後,把打log的代碼寫到另一個單獨的地方,然後命令AOP把你的代碼加過去,注意AOP不會把代碼加到源文件裏,但是它會正確的影響最終的機器代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章