1. 程式人生 > >【設計模式】面向物件六大原則

【設計模式】面向物件六大原則

主要內容

關於面向物件六大原則

單一職責原則(Single Responsibility Principle)

縮寫為SRP。

對於一個類而言,應該僅有一個引起它變化的原因。或者說一個類中應該是一組相關性很高的函式、資料的封裝。大意就是一個類應該只做一件事情,這就是職責,它的關鍵是劃分職責。

比如說一個圖片載入類,有圖片載入,有圖片快取,那麼我們需要的就是把兩個功能分成兩個類進行處理,這就是單一職責原則的體現,它會讓邏輯更加清晰。

開閉原則(Open Close Principle)

縮寫為OCP。

軟體中的物件、類、方法等應該是對於擴充套件是開放的,而對於修改是關閉的。當功能需要變化的時候,我們應該是通過擴充套件的方式來實現,而不是通過修改已有的程式碼。新的或者需要改變的特性可以通過類繼承的方式來重用程式碼。當然並不是說如果絕對不能通過修改原來的程式碼來實現變化,如果原來的程式碼存在很大的問題,這就需要重構,當然這是另一碼事了。

上面說到圖片快取,圖片快取有兩種,記憶體快取和本地快取。記憶體快取可以解決每次都從網路中載入圖片的問題,但是應用的記憶體是有限的,而且容易丟失。應用重啟之後,圖片快取就會丟失,這裡就需要重新下載,如果用本地快取,就可以解決這個問題。OK,那麼如何聯絡兩者的關係呢,這裡就用到了開閉原則。將圖片快取類作為一個介面,記憶體和本地快取都是通過實現介面,而且如果使用者想自定義快取策略,只需要實現介面就可以了。

里氏替換原則(Liskov Substitution Principle)

縮寫為LSP。

所有能使用父類物件的地方必須能使用其子類的物件。面嚮物件語言三大特性:封裝、繼承和多型,里氏替換原則就是基於繼承和多型的。他的核心是抽象,Java中抽象就是介面或者抽象類。

還是講圖片快取,我們把快取作為一個介面,使用時也是以這個介面建立方法,實現存和取,我們在傳的時候,就可以傳這個介面的實現類。當然這是實現介面,我們也可以把快取作為一個抽象類,繼承這個類,實現方法,同樣的,以這個抽象類為引數的方法可以傳入這個繼承類。

通過這個可見,里氏替換原則和開閉原則是相輔相成的。

依賴倒置原則(Dependence Inversion Principle)

縮寫為DIP。

這是一種解耦形式,講的是高層次的模組不依賴於低層次的模組的實現細節。這有幾個關鍵的地方:

  • 高層模組不應該依賴於低層模組,兩者都應該依賴其抽象
  • 抽象不應該依賴細節
  • 細節應該依賴於抽象

抽象就是介面或抽象類,細節就是實現類,高層就是呼叫端。模組間的依賴通過抽象發生,實現類之間不發生依賴關係,依賴是通過抽象產生的。

在實際中,我們可以通過依賴注入的形式在實現解耦,比如還是將圖片快取,我們要呼叫快取,如何呼叫呢?設定一個set方法,將快取介面傳進來,這樣我們可以傳介面本身,也可以傳它的實現類。

介面隔離原則(InterfaceSegregation Principles)

縮寫為ISP。

簡單來說就是使客戶端依賴的介面儘可能的小。

還是以圖片快取為例,上層不關注具體的實現細節,只要呼叫介面的存和取就可以了,這樣可以實現更低的耦合性,更高的靈活性。

迪米特原則(Law of Demeter)

縮寫為LOD。

也稱為最少知識原則。一個物件應該對其他物件有最少的瞭解,類的內部如何實現與呼叫者沒有關係,呼叫者只需要知道該呼叫的方法即可。

還是說圖片快取,用於在使用的時候只要呼叫快取方法就可以了,至於他們是記憶體快取或者本地快取怎麼實現的,這就不關心了。如果對底層瞭解夠深,改動的底層並不影響上層。

總結

說了這麼多,最重要的還是一句話:擁抱變化。當你的程式經歷過n個版本的迭代後仍然清晰、靈活和穩定,這就是最理想的狀況。

參考

《Android原始碼設計模式》