設計模式總是學不會?是時候換個姿勢了

碼個蛋發表於2019-06-27

起因

設計模式總是學不會?是時候換個姿勢了

設計模式的由來

設計模式總是學不會?是時候換個姿勢了

設計模式,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”,非要強行給加上各種模式。

問:“為什麼”,答:“總感覺少了模式!”。

設計模式總是學不會?是時候換個姿勢了

有以上症狀的,基本可以判斷中了模式的毒。

總結

本次主要學習了:

設計模式的由來,從建築而來。

設計模式是什麼,大佬的套路。

設計模式的分類,有三大分類。

設計模式的原則,有七大原則。

敲黑板:切記模式雖好,可不要濫用哦。

相關文章