設計模式是快速提升程式猿程式設計能力的一種方式。
首先是網上的解釋如下:
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,不要過多的暴露自己的内容,而且對應類與類之間的關系,盡量越少越好
了解:就是減少耦合,比如一個公司,銷售部和市場部直接溝通,不關心銷售部内部的人員以及解決方式,直接把問題送出給你就行了。 以後 講到【門面模式】和【中介者模式】會詳細講解的。
好處:還是低耦合,強調類之間的耦合性,耦合性越低,那麼工程的可修改性和可擴充性會大大提升。
開閉原則:
潛台詞:對擴充開放,對修改封閉
了解:有新需求的時候,直接對現有代碼進行擴充,而不用改變已經編寫好的代碼。詳見【工廠模式】