天天看點

初探設計模式6:面向對象7大設計原則及執行個體

開閉原則是這七大設計原則中最常見、最基本的

開閉原則定義:軟體實體對擴充是開放的,但對修改是關閉的。意思就是說在不修改軟體實體的基礎上去擴充其他功能。

開閉原則執行個體:

比如實作一個繪制圖線的功能

設計方案如下圖所示

初探設計模式6:面向對象7大設計原則及執行個體

使用者類中直接調用畫直線類,但是如果有一個新需求,要求我們畫斜線或者曲線的話,這時就需要修改畫直線類中的代碼(使用switch,else if),這樣就違背了開閉原則,于是我需要在不修改實體的基礎上去擴充畫斜線和曲線功能

重構後的代碼設計方案如下圖所示

初探設計模式6:面向對象7大設計原則及執行個體

這樣我們在沒有改動代碼的情況下,而是添加代碼的情況下完成功能擴充

如果一個類具有多個職責,應該把這多個職責分離出去,再分别建立一些類去一一完成這些職責

換句話說就是一個類的職責要單一,不能将太多的職責放在一個類中

單一職責核心:高内聚、低耦合

如下圖是一個類畫線的實作:

初探設計模式6:面向對象7大設計原則及執行個體

但是功能太過集中,嚴重違背了單一職責原則,重構後如下圖所示

初探設計模式6:面向對象7大設計原則及執行個體

是繼承複用的基石,說白了就是繼承與派生的規則

裡氏替換原則核心:在軟體系統中,一個可以接受父類對象的地方必然可以接受子類對象

裡氏替換原則執行個體:某系統需要實作畫直線功能,現在有DrawLineA和DrawLineB兩種畫圖方式,在操作類中提供了這兩種畫圖方法選擇畫直線

初探設計模式6:面向對象7大設計原則及執行個體

現在我需要改變或添加一種畫直線方式來畫直線,比如原先使用DrawLineA方式進行畫直線現在更換為DrawLineB方式來畫直線,如果直接修改操作類的代碼就違背了開閉原則。現在使用裡氏替換原則重構代碼,既可以友善了系統擴充,又遵循了開閉原則

重構後的方案圖如下圖所示

初探設計模式6:面向對象7大設計原則及執行個體

是以說裡氏替換原則是實作開閉原則的重要方法之一

依賴倒置也叫依賴注入、依賴倒轉

要針對抽象層程式設計,不要針對具體類程式設計

依賴倒置原則核心:要依賴于抽象,不要依賴于具體的實作。

分開來說:(注:抽象:接口或抽象類;細節:具體實作;如果把子產品層次關系比作基礎關系的話:高層子產品和底層子產品對應于父類和子類)

一、高層子產品不應該依賴底層子產品,這兩者應該依賴與其抽象 

二、抽想不應該依賴細節

三、細節應依賴抽象

依賴倒置執行個體:

比如某系統可以從本地擷取和伺服器擷取資料,後将資料可以為轉化配置成XML檔案和XLS檔案

初探設計模式6:面向對象7大設計原則及執行個體

假設我們增加了資料源或者有新的轉化格式,需要修改操作類裡面的源代碼,這樣就違背了開閉原則

現在使用依賴倒置原則對其進行重構

重構方案圖如下圖所示

初探設計模式6:面向對象7大設計原則及執行個體

執行個體解析OOP程式設計七大設計原則(二)

使用多個專門接口來取代一個統一的接口,

一個接口不需要提供太多的行為,一個接口應該隻提供一種對外的功能,不應該把所有的操作都封裝到一個接口中。

接口隔離原則核心:不應該強迫用戶端程式依賴他們 不需要的使用方法

接口隔離原則執行個體:

比如一個系統中有一個大的接口,這個接口包含了GameobjectA、GameobjecB、GameobjectC三個對象的接口

初探設計模式6:面向對象7大設計原則及執行個體

但是這三個對象中有些接口未必需要實作,現在使用接口隔離原則将接口隔離,這樣又滿足單一職責原則

重新構造的方案如下圖所示

初探設計模式6:面向對象7大設計原則及執行個體

又叫做最少知識原則,一個軟體實體對其他實體的引用越少越好,或者說如果兩個類不必直接通信,那麼這兩個類就不應當發生直接的互相作用,而是通過一個第三者發生間接性的互動。

迪米特原則核心:高内聚,低耦合

低迷特原理執行個體:

比如某一系統有多個系統和多個資料源,他們之間的聯系圖如下:

初探設計模式6:面向對象7大設計原則及執行個體

這樣比較雜亂,耦合性較高,使用迪米特原則後的構造方案如下圖所示:

初探設計模式6:面向對象7大設計原則及執行個體

迪米特原則缺點:

一、降低子產品間的通信效率

二、在系統的各個角落散落大量的小方法

在面向對象設計中,可以通過兩種基本方法在不同的環境中複用已有的設計和實作,即通過組合或通過繼承。

繼承複用:實作簡單,便于擴充。但是破壞系統的封裝性。

組合複用:耦合性相對較低,選擇性的調用成員對象的操作。可以再運作時動态運。.

合成複用核心:盡量使用對象組合而不是繼承達到複用的目的

初探設計模式6:面向對象7大設計原則及執行個體
初探設計模式6:面向對象7大設計原則及執行個體

繼續閱讀