關於OOP與AOP的思想淺析

前言

首先我們需要知道的是AOP是一種思想,而不是那種語句特有的,它可以克服那些只有單繼承特性語言的缺點(比如Java,後面會有實例進行講解)

區別:

  • OOP(Object Oriented Programming)

    面向對象編程是針對業務處理過程的實體及其屬性和行爲進行抽象封裝>的一種編程方法。

    OOP的目的就是獲得更加清晰高效的邏輯單元劃分

  • AOP(Aspect Oriented Programming)

    面向切面編程是針對業務處理過程中的切面進行提取操作,是處理過程中的某個步驟或階段的一種編程方法。

    AOP的目的是爲了獲得邏輯過程中各部分之間低耦合的隔離效果

正文

對某一個業務實體的封裝——OOP

對某一個過程的處理,例如“權限檢查”——AOP,這裏我們可以拿前端中的路由守衛進行說明。

每當頁面跳轉和刷新時都會走下面這個方法去檢查本地數據中是否存在token值,從而進行不同的操作。
在這裏插入圖片描述
OOP面向名詞領域:貓(屬性+行爲)、狗(屬性+行爲)、領導(屬性、行爲)

AOP面向動詞領域:權限檢查、日誌記錄、監控等

實例:併發訪問

假設有一個共享數據在同一時間內需要多個用戶訪問,那我們首先需要將這個數據利用OOP的思想封裝到一個數據對象中,命名爲:Data;然後我們需要創建幾個訪問這個對象的類。

如果我們要實現併發訪問,我們需要引入“鎖”的概念,在一個類訪問數據時將該數據上鎖,等該類釋放數據後,再立刻解鎖供其他類訪問,如下圖所示。
在這裏插入圖片描述
此時我們用OOP的思想創建一個抽象類作爲父類,讓所有的訪問類都繼承這個父類。
在這裏插入圖片描述
這時我們會發現,每一個訪問類中都有關於鎖狀態的代碼,而是這些代碼只有在跟鎖有關的場合纔會有其作用。不僅如此,又因爲Java只提供單一繼承,所以這些訪問類不能再繼承其他的父類,也就是說不能再有其他的需求可談。

如果我們用AOP的思想去看待這個問題,可以發現如下幾個問題:

1.在每個訪問類中鎖的功能不是主要功能

2.在每一個類要訪問數據之前都會用到鎖,在訪問這個過程中,鎖就像一道關卡橫在了訪問類與訪問數據之間。
在這裏插入圖片描述
因此產生了一個新的程序結構,該程序結構關注的是系統的縱向切面,如上圖中的鎖一樣,而這個新的程序結構就是我們所講的AOP中的Aspect(方面)。

不知道大家是否從上面的例子中體會到:其實AOP是一個從更抽象的概念來理解我們的系統的。

在搜索資料的過程中看到一句話感覺很好,在這裏跟大家分享一下:

如果說面向對象編程關注的是將需求功能劃分爲不同的並且相對獨立,封裝良好的類,並讓她們有着屬於自己的行爲,依靠繼承和多態等來定義彼此的關係的話;那麼面向切面編程則是希望能夠將通用需求功能從不相關的類當中分離出來,能夠使得很多類共享一個行爲,一旦發生變化,不必修改很多類,而只需修改這個行爲即可。

結尾

針對徒弟提出的問題:
在這裏插入圖片描述
公共行爲應用於多個無關對象模型之間是OOP的弱點,也說明了這正是AOP所解決的問題,OOP正是因爲其面向的是對象,在上面的實例中也很鮮明地體現了,當我們在用OOP去設置一個Lock的時候,每個類中都有相同的代碼(且複用率低),而且再也無法繼承其他類,不僅代碼冗餘還使其不可拓展不夠靈活。所以說對於公共行爲應用於多個無關對象模型之間是OOP的一個弱點,不過AOP彌補了OOP的不足。

以上這些就是對OOP和AOP的簡單講述,希望讀後讓你有所瞭解,本人也是初次學習歡迎交流。

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