1. 程式人生 > >設計模式 面向物件設計七原則

設計模式 面向物件設計七原則

概論

面向物件設計原則的目的是為了在提高程式碼可維護性的同時,去提高系統的可複用性。 另一種說法即實現支援可維護性的複用。 一個好的系統設計要具備以下三個性質: 1、可拓展性:容易將新的功能模組加入到系統中。 2、靈活性:程式碼修改不會波及很多其他的功能模組。 3、可插入性:可以很方便的將一個類抽出,並將另一個有相同介面的類插入進去。

單一職責原則

定義:一個物件應該只包括單個職責,且實現該職責的功能被完整的封裝在一個類中,實現高內聚,低耦合。 分析:一個類承擔的職責越多,那麼他的可複用性就越小,並且會導致類中各職責的耦合度升高,一個職責往往會牽涉到其他的職責,這樣當我們想複用其中的某一個職責時,往往會引起其他職責的運作,程式碼過於僵硬,不符合系統三性質中的靈活性。類的職責主要分為屬性職責和方法職責,有時我們只希望a職責執行,而b職責不執行,但由於類中職責太多導致a職責一旦執行會導致b職責的執行,這不是我們所希望看到的,所以將個各職責封裝在不同的類中,若一個功能需要ab職責同時負責,那麼可以將兩職責寫在同一個類中。 例子: 在這裡插入圖片描述

重構以後: 在這裡插入圖片描述 這樣就實現了資料庫連線程式碼和資料庫操作程式碼的複用。

開閉原則

定義:對擴充套件開放,對修改關閉。 分析:在擴充套件時能夠輕易的擴充套件功能,而不修改原本已有的程式碼,這使得系統具有良好的適應性和穩定性。實現開閉原則的關鍵在於抽象化設計把一個功能模組設計為兩層,高層為抽象類定義了抽象方法,底層是具體的實現類,這樣需要擴充套件功能時,只需要新建具體的實體類來實現業務就行了。開閉原則要求”對可變性進行封裝“,要求找到系統的可變因素,根據不同的可變因素,為之劃分出不同的具體實現類。 例項: 在這裡插入圖片描述 重構以後: 在這裡插入圖片描述 這樣利用物件的多型性,完成了在既不修改以前的程式碼的同時,擴充套件功能只需要繼承抽象類,再覆寫其中的方法即可。 里氏代換原則

定義:所有引用超類的地方必須能夠同名的使用其子類。(實現開閉原則的方式之一) 分析:在軟體中如果能使用超類物件,那麼必能替換成其子類物件,具體在使用中是在會使用子類物件的地方,使用其超類物件來定義,這樣可以接受不同種類的超類的子類物件,符合開閉原則。 使用里氏代換原則需要注意的點: 1、子類的所有方法必須在其超類中宣告,不然在替換時無法通過定義的超類物件來呼叫子類中要實現的方法。 2、儘量把超類設計成介面或者抽象類,這樣只需讓子類去繼承超類,並實現其中的方法,要擴充套件方法時,只需要在超類中宣告方法即可,因為實現是在子類中的,這樣可以很方便的擴充套件系統的功能,而不修改已有原有子類的程式碼,且在超類中只是多聲明瞭方法,並沒有修改已有的程式碼,這符合開閉原則。 例項: 在這裡插入圖片描述

在這個例項中我們可以看到在EmailSender類中定義了兩個功能一樣但引數型別不一樣的方法,根據里氏替換原則,若我們想要新增一個客戶類的話,則需要再新建一個客戶類,但我們知道其實他們傳送郵件的行為都是差不多的,且類中的屬性和方法基本一致,所以為了減少程式碼的重複和使系統已擴充套件,我們可以定義一個抽象類,讓客戶類派生於此抽象類。由此想再擴充套件新型別的客戶就方便許多了,且不必更改EmailSender中的方法。 在這裡插入圖片描述