起因

設計模式的由來

設計模式,1977 年有位美國著名建築大師提出,他叫Christopher Alexander(克里斯托弗.亞歷山大)。他擁有劍橋大學數學碩士學位和建築學學士學位,以及哈佛大學建築學博士學位,有“模式它爹”的稱號。

1990 年,軟體工程界開始研討設計模式的話題。1994 年,艾瑞克·伽馬(ErichGamma)、理査德·海爾姆(Richard Helm)、拉爾夫·約翰森(Ralph Johnson)、約翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《設計模式:可複用物件導向軟體的基礎》(Design Patterns: Elements of Reusable Object-Oriented Software)一書。

在本教程中收錄了 23 個設計模式,這是設計模式領域裡程碑的事件,導致了軟體設計模式的突破。

這 4 位作者在軟體開發領域裡也以他們的“四人組”(Gang of Four,GoF)匿名著稱。
什麼是設計模式?

它能提高程式設計師的思維能力、程式設計能力和設計能力。
它是解決特定問題的一系列套路,有一定的普遍性。
它是一套被反覆使用、多數人知曉的、程式碼設計經驗的總結。
它可以提高程式碼的可重用性、程式碼的可讀性和程式碼的可靠性以及可擴充套件性。
它能使程式設計更加標準化,使軟體開發效率大大提高,從而縮短軟體的開發週期
是它是它就是它,程式設計界的武林祕籍,絕世高手都練過它!

設計模式的分類
模式一共分為3種不同型別的模式。
建立型模式(Creational patterns)
提供物件建立機制,增加現有程式碼的靈活性和重用。
結構型模式(Structural patterns)
解釋如何將物件和類組裝成更大的結構,同時保持結構的靈活性和高效性。
行為型模式(Behavioral patterns)
負責有效的溝通和物件之間的責任分配。


設計模式的七大原則
單一職責原則 (Single Responsibility Principle, SRP)
含義:一個類只負責一個功能領域中的相應職責。
栗子:就像一家公司,團隊中每個人都分工明確。有產品經理,專案經理,技術經理,QA經理等等。

好處:降低類複雜性降低,提高程式碼可讀性,提高可維護性。

開閉原則 (Open-Closed Principle, OCP)
含義:軟體模組應該對擴充套件開放,對修改關閉。在程式需要進行新增功能的時候,不能去修改原有的程式碼,而是新增程式碼。
栗子:就像插座一樣,可以給很多不同的電器充電,但是不需要改變插座本身,只要提前把插頭的規格定義好。

好處:為了使程式的擴充套件性好,易於維護和升級。

里氏代換原則 (Liskov Substitution Principle, LSP)
含義:子類可以擴充套件父類的功能,但不能改變父類原有的功能。
栗子:正好今天請我去吃小龍蝦,那就說說蝦,它是一種食品。蝦的衍生類很多有南極紅蝦、青蝦、河蝦、草蝦、對蝦、明蝦、龍蝦等,如果衍生類替換了基類的原本方法,如把食品改成了體育用品(那麼軟體的基本功能受到影響),就不符合里氏代換原則。

好處:對實現抽象化的具體步驟的規範。

依賴倒轉原則 (Dependence Inversion Principle, DIP)
含義:高層模組不應該依賴低層模組,二者都應該依賴其抽象。針對介面程式設計,而不是針對實現程式設計。
栗子:以電腦為例,無論主機板、CPU、記憶體、硬體都是在針對介面設計的,如果出現某個區域性的配件壞了就只要替換對應的配件就行了。如果針對實現來設計,那麼電腦螢幕壞了就需要把主機也一併換掉。

好處:降低模組間的耦合。

介面隔離原則 (Interface Segregation Principle, ISP)
含義:使用多個隔離的介面,比使用單個介面要好,將臃腫龐大的介面拆分成更小的介面。
栗子:假設要設計操控機器人的介面,不能只有行動和停止的介面,行動可以拆分成前進,後退,轉向,跳躍,等等,介面拆分可以使組合更多。

好處:提高系統的靈活性和可維護性。

合成複用原則 (Composite Reuse Principle, CRP)
含義:就是能用合成/聚合的地方,絕不用繼承。儘量先使用組合或者聚合等關聯關係來實現,其次才考慮使用繼承關係來實現。
栗子:汽車按“動力源”劃分可分為汽油汽車、電動汽車等;按“顏色”劃分可分為白色汽車、黑色汽車和紅色汽車等。如果同時考慮這兩種分類,其組合就很多。

好處:提高靈活性,降低類與類之間的耦合度。

迪米特法則 (Law of Demeter, LoD)
含義:又叫最少知道原則,一個實體應當儘量少的與其他實體之間發生相互作用,使得系統功能模組相對獨立。
栗子:智慧音響,只需要把指令告訴智慧音響,智慧音響就會識別指令去呼叫各種已連結的電器,如:我要看湖南衛視,把空調溫度低一點,掃地機器人開啟清掃,等等。智慧音響幫我們解決了要找很多遙控器的煩惱。

好處:降低類之間的耦合,減少對其他類的依賴。

新手誤區
不合理的使用,這個問題很多剛學習的新手都會犯。
就像你手裡有一把錘子,所有東西看上去都像釘子。
要對設計模式的使用場景有一定的認識後才使用,不要濫用。
如:輸出一句“hello world”,非要強行給加上各種模式。
問:“為什麼”,答:“總感覺少了模式!”。

有以上症狀的,基本可以判斷中了模式的毒。
總結
本次主要學習了:
設計模式的由來,從建築而來。
設計模式是什麼,大佬的套路。
設計模式的分類,有三大分類。
設計模式的原則,有七大原則。
敲黑板:切記模式雖好,可不要濫用哦。