天天看點

初識設計模式——設計模式的六大原則單一職責原則(Single Responsibility Principle, SRP)開放-關閉原則(Open-Closed Principle, OCP)裡氏代換原則(LSP)依賴倒轉原則(DIP)迪米特原則(最少知識原則 LOD)合成、聚合原則(CARP)下一篇

單一職責原則(Single Responsibility Principle, SRP)

定義:

就一個類而言,應該僅有一個引起它變化的原因

解釋:

如果一個類承擔的職責過多,就等于把這些職責耦合在一起,一個職責的變化可能會削弱或抑制這個類完成其他職責的能力,當變化發生時,設計會遭到意想不到的破壞。

開放-關閉原則(Open-Closed Principle, OCP)

定義:

對于擴充是開放的,對于修改是封閉的。

解釋:

對一個已完成的類,如果需要修改或增加其中的功能,最好使用繼承的方式對其擴充,盡量不要改動類的本身。

裡氏代換原則(LSP)

定義:

子類型必須能夠替換掉他們的父類型。

解釋:

當隻有子類可以替換掉父類,軟體的機關功能不會受到影響時,父類才能真正被複用,而子類可以在父類的基礎上增加新的行為。

依賴倒轉原則(DIP)

定義:

  1. 高層子產品不應該依賴底層子產品。兩個應該依賴抽象
  2. 抽象不應該依賴細節,細節應該依賴抽象

解釋:

舉例說明:設計一個類,其主要的功能就是連結資料庫,并對資料庫進行增删改查等相關操作。如果我們把這個類隻寫成連結Mysql的類,那在使用過程中如果需要連結SQLserver,我們就需要在增加一個類。這就是高層(調用類的代碼)依賴底層(連結資料庫的類)。是以在Thinkphp或者Yii中一般都建立一個抽象的類或接口,所有的子類是實作連結或調用不同資料庫的類,在高層代碼中,通過不同的設計模式調用即可,無需修改大量代碼。(這個完全是自己的了解,可能不正确)

迪米特原則(最少知識原則 LOD)

定義:

如果兩個類不必彼此直接通信,那麼兩個類就不應當發生直接的互相作用。如果其中一個類需要調用另一個類的某一個方法的話,可以通過第三者轉發這個調用。

解釋:

還是舉例說明

在Thinkphp中封裝了一個微信的類庫,在裡面需要緩存access_token,如果直接使用Thinkphp中Cache的類庫,那麼這個類在Yii架構中使用時就要修改這個代碼的元件、命名空間、類庫名稱及方法,這隻是一個,還有其他很多很多。是以這時候建立一個第三方的類庫,在這個裡面封裝了與其他元件溝通的橋梁,如果需要遷移類庫,我們隻需要修改這個第三方類庫即可。

代碼示例:

初識設計模式——設計模式的六大原則單一職責原則(Single Responsibility Principle, SRP)開放-關閉原則(Open-Closed Principle, OCP)裡氏代換原則(LSP)依賴倒轉原則(DIP)迪米特原則(最少知識原則 LOD)合成、聚合原則(CARP)下一篇
public static function cache($name, $value = null)
    {
        $name = 'wechat_'.$name;
        if (empty($value)) {
            return Cache::get($name);
        }
        if (is_array($value)) {
            $value = json_encode($value, JSON_UNESCAPED_UNICODE);
        }
        return Cache::set($name, $value);
    }           

第一張圖中Base類中存在方法getAccessToken(),其中調用Proxy::cache()方法,Proxy::cache()中調用Thinkphp自帶的Cache類庫,如果應用場景變為Yii2擴建,我們隻需要修改Proxy::cache()中的代碼就可以,無需改變Base中的代碼。

合成、聚合原則(CARP)

定義:

盡量使用合成、聚合,盡量不要使用類的繼承。

解釋:

優先使用類的合成/聚合将有助于你保持每個類被封裝,并被集中到單個任務上。這樣類和類繼承的層次會保持在最小規模上,并且不太可能增長成為不可控制的龐然大物。

這裡需要着重說明一下,在其他的資料中發現這個原則不在6大原則之内,而剩餘的另一大原則為【接口隔離原則】(ISP),個人了解感覺這兩個原則很像,是以附加接口隔離原則的介紹網址,我這裡就将這兩個原則合并為一個原則了,感覺書上的說法比較籠統而已,因為合成/聚合确實在代碼中不常見,而且不知道怎麼實作。

下一篇

初識設計模式——簡單工廠模式、政策模式及兩者的結合使用

繼續閱讀