開始 今天和大家聊聊AOP:面向切麵編程思想。開始聊之前,先和大家一起從編程思想的發展說起。 編程思想的發展歷程: 1、POP編程 首先,大家應該都知道,什麼是POP編程吧,就是面向過程編程。關於這個編程思想就不做介紹了。 從思維上來講,面向過程更強調細節,忽視了整體性和邊界性。 典型代表是 C/C ...
開始
今天和大家聊聊AOP:面向切麵編程思想。開始聊之前,先和大家一起從編程思想的發展說起。
編程思想的發展歷程:
1、POP編程
首先,大家應該都知道,什麼是POP編程吧,就是面向過程編程。關於這個編程思想就不做介紹了。
從思維上來講,面向過程更強調細節,忽視了整體性和邊界性。
典型代表是 C/C++的結構體。
POP的不足:
代碼重用性低,不易擴展,維護起來難度大,耦合度比較高。
2、OOP編程
面向對象編程,把事物對象化,對象包含屬性和方法,萬物皆對象。
當規模不大,面向過程編程就可以了
最終實現業務,還是得面向過程,按照過程,把業務串起來。
OOP的形式:一個模塊由多個類組成,模塊又組成某個服務,多個服務組成一個系統
業務變更,需要修改代碼,類肯定要發生改變
但是類應該是固定的,不應該頻繁被修改,甚至是不允許修改
從而引出了設計模式,就是為瞭解決這個問題。
OOP的思想,對象組織,是以繼承關係為主線,縱向的,有底到高。
OOP問題:
1)、共性問題,縱向思維,共性越多,介面就越多
2)、擴展問題,需要對現有的對像動態添加某種行為。
因此,由於OOP的問題,從而引出了AOP編程
3、AOP編程
所謂的AOP :面向切麵編程,它是可以通過預編譯的方式和運行期動態實現,在不修改源代碼的情況下,給程式動態統一添加功能的技術。
OOP是關註將需求功能劃分為不同的,相對獨立的,封裝良好的類,並讓他們有自已的行為,依靠繼顧,多態來定義彼此的關係。
AOP是希望能夠將通用功能從不相關的類分離出來,能夠使很多類,共用一個行為,這個行為,一旦發生變化,我們只需要修改這個行為就行了,而不需要去修改其他的類。
AOP的切麵怎麼理解呢?
橫切關註點:比如一個電商系統,處理一個訂單,需要進行授權認證,訂單處理,日誌記錄。。。更多操作;商品入庫,也需要進行授權認證,入庫處理,日誌記錄。。。更多操作。
OOP,程式都是通過類和介面組織的,核心業務邏輯採用OOP是很合理的。但對於橫跨系統中多個模塊的功能需求,就比較吃力了,比如日誌處理,授權驗證,統一的異常處理,性能統計等
而這些都有一個共同點,都是非業務的,非業務的功能代碼,從業務代碼中抽離出來,獨立到非業務的功能代碼中,這樣我們改變這些行為時,就不會影響現有的業務邏輯代碼
簡單來說,AOP就是將通用功能抽取出來。面向切麵,就是關註通用功能,而不關註業務,而我們的OOP是關註業務的,這就是它們的區別。
AOP實現原理:預先定義一組特性,使它具有攔截方法的功能,執行方法之前和之後做你想要做的事情,而這個的攔截關卡,就是所謂的切麵
過濾器,其實就是AOP的一種實現
AOP的優勢:
1)、將通用功能從業務邏中抽離出來,提高代碼的復用性,有利於後期的維護和擴展
2)、在軟體設計時,抽出通用功能(抽出切麵),降低架構的複雜度,這樣在做系統時,只需要完成業務處理功能
4、AOP和OOP的區別:
1)、面向的目標不同:OOP面向的是名詞領域(商品、對象、類),AOP面向的是動詞領域(授權、驗證、監控、埋點)
2)、思想結構不同:OOP是縱向結構,AOP是橫向結構。
3)、註重的方面不同:OOP註重業務邏輯單元的劃分;AOP偏重業務處理過程中某個步驟或者階段的行為。
5、AOP和OOP的關係。
AOP其實是OOP的一個補充,它們都是編程思想,是相互彌補各自的不足,就猶如,OOP彌補POP的不足。
核心需求,仍然由OOP來實現,具體的業務,由POP來實現。而AOP就是為了讓OOP更專註於業務的邏輯處理,它們都是相輔相成的
6、如何在代碼里去實現AOP
這裡就不過多的介紹了,實現在AOP的方式有很多種,通過設計模式就可以實現。
裝飾器模式:允許向一個對象添加新的功能,同時又不改變其結構。
代理模式:一個類代表別一個類,然後向外界提供功能介面。
過濾器。