OOP與AOP的理解

    本人是搞android開發的,平時對OOP運用比較多,對其思想也自然比較熟悉。相比之下大多數android開發者對AOP的比較默認,所以這裏來總結一下兩者的區別

1.概念

OOP是面向對象編程,核心思想是將客觀存在的不同事物抽象成相互獨立的類,然後把與事物相關的屬性和行爲封裝到類裏,並通過繼承和多態來定義類彼此間的關係,最後通過操作類的實例來完成實際業務邏輯的功能求。

AOP是面向切面編程,核心思想是將業務邏輯中與類不相關的通用功能切面式的提取分離出來,讓多個類共享一個行爲,一旦這個行爲發生改變,不必修改類,而只需要修改這個行爲即可。

2.區別

OOP面向對象的三大特徵 : 封裝 , 繼承 , 多態 。這些特徵也說明了OOP是面向對象的,我們做什麼都是考慮一個對象,我們需要完成一個任務的時候一般都想着把一些操作封裝成一個類,所有的變量和操作都封裝到一個類裏面,那麼這個類就是我們的對象,我們要實現某個特定的功能,首先也想想着在這個對象裏面去實現。 

OOP將功能分散到不同的對象中去。讓不同的類設計不同的方法,這樣代碼就分散到一個個的類中。可以降低代碼的複雜程度,提高類的複用性。

但是在分散代碼的同時,也增加了代碼的重複性。比如說,我們在兩個類中,可能都需要在每個方法中做日誌。按照OOP的設計方法,我們就必須在兩個類的方法中都加入日誌的內容。也許他們是完全相同的,但是因爲OOP的設計讓類與類之間無法聯繫,而不能將這些重複的代碼統一起來。然而AOP就是爲了解決這類問題而產生的,它是在運行時動態地將代碼切入到類的指定方法、指定位置上的編程思想。

比如Android中一些按鍵統計、生命週期統計,特定統計都是比較瑣碎的事情,要利用面向對象的思想去實現都不是很完美,這就要求去一一實現,顯得很瑣碎。

OOD/OOP面向名詞領域AOP面向動詞領域。 
如果說面向對象編程是關注將需求功能劃分爲不同的並且相對獨立,封裝良好的類,並讓它們有着屬於自己的行爲,依靠繼承和多態等來定義彼此的關係的話;那麼面向方面編程則是希望能夠將通用需求功能從不相關的類當中分離出來,能夠使得很多類共享一個行爲,一旦發生變化,不必修改很多類,而只需要修改這個行爲即可。 
兩者不但不是互相競爭的技術而且彼此還是很好的互補。面向對象編程主要用於爲同一對象層次的公用行爲建模。它的弱點是將公共行爲應用於多個無關對象模型之間。而這恰恰是面向方面編程適合的地方。有了 AOP,我們可以定義交叉的關係,並將這些關係應用於跨模塊的、彼此不同的對象模型。AOP 同時還可以讓我們層次化功能性而不是嵌入功能性,從而使得代碼有更好的可讀性和易於維護。它會和麪向對象編程合作得很好。

總結起來就是

1、面向目標不同:簡單來說OOP是面向名詞領域,AOP面向動詞領域。
2、思想結構不同:OOP是縱向結構,AOP是橫向結構。
3、注重方面不同:OOP注重業務邏輯單元的劃分,AOP偏重業務處理過程的某個步驟或階段。

 

 

3.AOP在android中的運用

從技術上來說,AOP基本上是通過代理機制實現的。代理模式體現了AOP的思想。

Android中基於AOP實現的庫有ButterKnife、dagger2、EventBus3.0、Retrofit 2.0等等,不是說這些庫完全基於AOP實現,只是說裏面部分功能基於AOP。

 

關於android中AOP部分,再深入就是AspectJ的使用,這是一種類似Java的語言,與java相互兼容,可在android平臺運行。有興趣的可以點鏈接學習

 

最後說下,兩者之間是一個相互補充和完善的關係,如果能掌握好其各自優勢並運用,對我們的編程是非常有幫助的

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