天天看點

設計模式《七大原則》

設計模式是快速提升程式猿程式設計能力的一種方式。

首先是網上的解釋如下:

1. 單一職責原則

每一個類應該專注于做一件事情。

2. 裡氏替換原則

父類存在的地方,子類是可以替換的。

3. 依賴倒置原則

實作盡量依賴抽象,不依賴具體實作。高層子產品不應該直接依賴于低層子產品,高層子產品和低層子產品應該同時依賴一個抽象層。

4. 接口隔離原則

應當為用戶端提供盡可能小的單獨的接口,而不是提供大的總的接口。

5. 迪米特法則

又叫最少知識原則,一個軟體實體應當盡可能少的與其他實體發生互相作用。

6. 開閉原則

面向擴充開放,面向修改關閉。

7. 組合/聚合複用原則

盡量使用合成/聚合達到複用,盡量少用繼承。原則: 一個類中有另一個類的對象。

自己的解釋如下:

單一職責原則:

潛台詞:專注做一個事,做自己的事,不受别人影響。
了解:隻負責我的事,專注幹好自己的東西。 MVC架構

好處:

提高可讀性,一個功能一個類

出現BUG時可以縮小出錯的範圍,定位準确。減少加班

修改邏輯時減少失誤,假如你要增加産品價格,結果增加到boss的爆率上了。

裡式替換原則:

潛台詞:父類不在可以用兒子替代。

了解:工廠模式中一樣,傳回類型是父類,但是new的卻是兒子們

好處就不用說了。直接上代碼

public abstract class  Phone
{
    public abstract void Call();
}
 interface Android{ }
 interface IOS{ }

public class OnePlus : Phone, Android
{
    public override void Call()
    {
        Debug.Log($"{nameof(OnePlus)}進行通話。。。。。");
    }
}

public class Pixel : Phone, Android
{
    public override void Call()
    {
        Debug.Log($"{nameof(Pixel)}進行通話。。。。。");
    }
}
public class XiaoMi : Phone, Android
{
    public override void Call()
    {
        Debug.Log($"{nameof(XiaoMi)}進行通話。。。。。");
    }
}

public class Apple : Phone, IOS
{
    public override void Call()
    {
        Debug.Log($"{nameof(Apple)}進行通話。。。。。");
    }
}

//****************************************************
//-----不使用裡氏替換原則,需要一個個調用
  public void WantToCall_0(OnePlus phone)
    {
        phone.Call();
    }

    public void WantToCall_1(Pixel phone)
    {
        phone.Call();
    }

    public void WantToCall_2(XiaoMi phone)
    {
        phone.Call();
    }

    public void WantToCall_3(Apple phone)
    {
        phone.Call();
    }
//****************************************************
//----使用裡式替換原則
 public void WantToCall_4(Phone phone)
    {
        phone.Call();
    }
           

依賴倒置原則:

潛台詞:抽象不應該依賴細節;細節應該依賴抽象。 依賴倒置原則的核心思想是面向接口程式設計。
了解:華碩和微型都可使用不同型号的顯示卡,反之不同型号的顯示卡也可以使用在不同品牌的主機闆上,我了解成外觀模式那樣, 子產品化程式設計,
//顯示卡
public interface IGraphicsCard
{
    void BeginWork(IMainboard mainboard);
}
//主機闆
public interface IMainboard
{
    void GetElectricity();
    void DrawPicture(IGraphicsCard graphicsCard);
}


public class NVIDIA_2018Ti : IGraphicsCard
{
    public NVIDIA_2018Ti(IMainboard mainboard)
    {
        BeginWork(mainboard);
    }
    public void BeginWork(IMainboard mainboard)
    {
        mainboard.GetElectricity();
        Debug.Log($"NVIDIA_2018Ti擷取{mainboard.GetType()}電量後開始工作");
    }
}
public class NVIDIA_2018 : IGraphicsCard
{
    public NVIDIA_2018(IMainboard mainboard)
    {
        BeginWork(mainboard);
    }
    public void BeginWork(IMainboard mainboard)
    {
        mainboard.GetElectricity();
        Debug.Log($"NVIDIA_2018擷取{mainboard.GetType()}電量後開始工作");
    }
}

//華碩主機闆
public class Asus : IMainboard
{
    public void DrawPicture(IGraphicsCard graphicsCard) { }
    public void GetElectricity() { }
}
//微型主機闆
public class MSI : IMainboard
{
    public void DrawPicture(IGraphicsCard graphicsCard) { }
    public void GetElectricity() { }
}

//-----繪制
    public void DrawPicture()
    {
        IMainboard aSus = new Asus();
        aSus.DrawPicture(new NVIDIA_2018Ti(aSus));
        aSus.DrawPicture(new NVIDIA_2018(aSus));

        IMainboard mSI = new MSI();
        mSI.DrawPicture(new NVIDIA_2018Ti(mSI));
        mSI.DrawPicture(new NVIDIA_2018(mSI));
    }
           

接口隔離原則:

潛台詞:定義的接口盡量按照功能細分
了解:比如手機,微信是一個接口,打電話一個接口,發短信一個接口,聽歌是一個接口,注意和單一職責原則分開,一個是接口,一個是普通class類

迪米特原則:

潛台詞:能用 private、protected的就不要用public,不要過多的暴露自己的内容,而且對應類與類之間的關系,盡量越少越好
了解:就是減少耦合,比如一個公司,銷售部和市場部直接溝通,不關心銷售部内部的人員以及解決方式,直接把問題送出給你就行了。 以後 講到【門面模式】和【中介者模式】會詳細講解的。
好處:還是低耦合,強調類之間的耦合性,耦合性越低,那麼工程的可修改性和可擴充性會大大提升。

開閉原則:

潛台詞:對擴充開放,對修改封閉
了解:有新需求的時候,直接對現有代碼進行擴充,而不用改變已經編寫好的代碼。詳見【工廠模式】

繼續閱讀