設計模式復習提綱
第一章
1.狀態圖的定義
狀態圖用來描述一個特定對象的所有可能狀態及其引起狀態轉移的事件。
第二章
1.軟件的可維護性和可復用性(?)
軟件可維護性,即維護人員對該軟件進行維護的難易程度,具體包括理解、改正、改動和改進該軟件的難易程度。
可復用性:復用又叫重用,是重復使用的意思。
2.面向對象設計原則
(1)
單一職責原則
(2)
開閉原則
(3)
里氏代換原則
(4)
依賴倒轉原則
(5)
接口隔離原則
(6)
合成復用原則
(7)
迪米特法則
3.單一職責原則定義
單一職責原則定義:一個對象應該只包含單一的職責,并且該職責被完整地封裝在一個類中。
另一種定義:就一個類而言,應該僅有一個引起它變化的原因。
4.開閉原則定義
開閉原則定義:一個軟件實體應當對擴展開放,對修改關閉。
5.里氏代換原則定義
里氏代換原則有兩種定義方式。
第一種定義方式相對嚴格,其定義如下:
如果對每一個類型為S的對象o1,都有類型為T的對象o2,使得以T定義的所有程序P在所有的對象o1都代換成o2時,程序P的行為沒有變化,那么類型S是類型T的子類型。
第二種更容易理解的定義方式如下:
所有引用基類(父類)的地方必須能透明地使用其子類的對象。
6.依賴倒轉原則定義
依賴倒轉原則定義:高層模塊不應該依賴低層模塊,它們都應該依賴抽象。抽象不應該依賴于細節,細節應該依賴于抽象。
另一種表述為:要針對接口編程,不要針對實現編程。
7.接口隔離原則定義
接口隔離原則定義:客戶端不應該依賴那些它不需要的接口。注意:在該定義中的接口指的是所定義的方法。
另一種定義方法:一旦一個接口太大,則需要將它分割成一些更細小的接口,使用該接口的客戶端僅需知道與之相關的方法即可。
8.合成復用原則定義
合成復用原則,又稱為組合/聚合復用原則,其定義如下:盡量使用對象組合,而不是繼承來達到復用的目的。
9.迪米特法則定義
迪米特法則,又稱為最少知識原則,它有多種定義方法,其中幾種典型定義如下:
(1)
不要和“陌生人”說話。
(2)
只與你的直接朋友通信。
(3)
每一個軟件單位對其他的單位都只有最少的知識,而且局限于那些與本單位密切相關的軟件單位。
第三章
1.模式的定義
每個模式都描述了一個在我們的環境中不斷出現的問題,然后描述了該問題的解決方案的核心,通過這種方式,我們可以無數次地重用那些已有的解決方案,無需再重復相同的工作。可以用一句話簡單表示為:
模式是在特定環境中解決問題的一種方案。
2.設計模式的定義
設計模式是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結,使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
3.設計模式的基本要素
設計模式一般有如下幾個基本要素:模式名稱、問題、目的、解決方案、效果、實例代碼和相關設計模式,其中的關鍵元素包括以下四個方面:模式名稱、問題、解決方案、效果。
4.設計模式的分類
(1)根據其目的(模式是用來做什么的)可分為創建型、結構型和行為型三種:
①創建型模式主要用于創建對象。
②結構型模式主要用于處理類或對象的組合。
③行為型模式主要用于描述對類或對象怎樣交互和怎樣分配職責。
(2)根據范圍,即模式主要是用于處理類之間關系還是處理對象之間的關系,可分為類模式和對象模式兩種:
①類模式處理類和子類之間的關系,這些關系通過繼承建立,在編譯時刻就被確定下來,是屬于靜態的。
②對象模式處理對象間的關系,這些關系在運行時刻變化,更具動態性。
5.GoF設計模式簡介
GoF
最先將模式的概念引入軟件工程領域,他們歸納發表了23種在軟件開發中使用頻率較高的設計模式,旨在用模式來統一溝通面向對象方法在分析、設計和實現間的鴻溝。
6.設計模式的優點
設計模式是從許多優秀的軟件系統中總結出的成功的、能夠實現可維護性復用的設計方案,使用這些方案將避免我們做一些重復性的工作,而且可以設計出高質量的軟件系統。設計模式的主要優點如下:
(1)設計模式融合了眾多專家的經驗,并以一種標準的形式供廣大開發人員所用,它提供了一套通用的設計詞匯和一種通用的語言以方便開發人員之間溝通和交流,使得設計方案更加通俗易懂。對于使用不同編程語言的開發和設計人員可以通過設計模式來交流系統設計方案,每一個模式都對應一個標準的解決方案,設計模式可以降低開發人員理解系統的復雜度。
(2)設計模式使人們可以更加簡單方便地復用成功的設計和體系結構,將已證實的技術表述成設計模式也會使新系統開發者更加容易理解其設計思路。設計模式使得重用成功的設計更加容易,并避免那些導致不可重用的設計方案。
(3)設計模式使得設計方案更加靈活,且易于修改。
(4)設計模式的使用將提高軟件系統的開發效率和軟件質量,且在一定程度上節約設計成本。
(5)設計模式有助于初學者更深入地理解面向對象思想,一方面可以幫助初學者更加方便地閱讀和學習現有類庫與其他系統中的源代碼,另一方面還可以提高軟件的設計水平和代碼質量。
補充:7.設計模式主題:復用與擴展。
8.設計模式基本原則(?)
同面向對象設計原則。
廣義工廠模式包括:簡單工廠模式、工廠方法模式、抽象工廠模式。
第四章
簡單工廠模式——不是GoF23種模式中的一員
補充:創建型模式概述:
創建型模式對類的實例化過程進行了抽象,能夠將軟件模塊中對象的創建和對象的使用分離。創建型模式在創建什么(What),由誰創建(Who),何時創建(When)等方面都為軟件設計者提供了盡可能大的靈活性。創建型模式隱藏了類的實例的創建細節,通過隱藏對象如何被創建和組合在一起達到使整個系統獨立的目的。
1.定義:
簡單工廠模式:又稱為靜態工廠方法模式,它屬于類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
2.結構圖:
3.主要優缺點:
簡單工廠模式最大的優點在于實現對象的創建和對象的使用分離,將對象的創建交給專門的工廠類負責;但是其最大的缺點在于工廠類不夠靈活,增加新的具體產品需要修改工廠類的判斷邏輯代碼,而且產品較多時,工廠方法代碼將會非常復雜。
第五章
工廠方法模式
1.定義:
工廠方法模式又稱為工廠模式,也叫虛擬構造器模式或者多態工廠模式,它屬于類創建型模式。在工廠方法模式中,工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣做的目的是將產品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該實例化哪一個具體產品類。
2.結構圖:
3.主要優缺點:
工廠方法模式的主要優點是增加新的產品類時無須修改現有系統,并封裝了產品對象的創建細節,系統具有良好的靈活性和可擴展性;其缺點在于增加新產品的同時需要增加新的工廠,導致系統類的個數成對增加,在一定程度上增加了系統的復雜性。
第六章
抽象工廠模式
1.定義:
抽象工廠模式:提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱為Kit模式,屬于對象創建型模式。
2.結構圖:
3.主要優缺點:
抽象工廠模式的主要優點是隔離了具體類的生成,使得客戶并不需要知道什么被創建,而且每次可以通過具體工廠類創建一個產品族中的多個對象,增加或者替換產品族比較方便,增加新的具體工廠和產品族很方便;主要缺點在于增加新的產品等級結構很復雜,需要修改抽象工廠和所有的具體工廠類,對“開閉原則”的支持呈現傾斜性。
第七章
建造者模式
1.定義:
建造者模式:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。建造者模式是一步一步創建一個復雜的對象,它允許用戶只通過指定復雜對象的類型和內容就可以構建它們,用戶不需要知道內部的具體構建細節。建造者模式屬于對象創建型模式。根據中文翻譯的不同,建造者模式又可以稱為生成器模式。
2.結構圖:
3.主要優缺點:
建造者模式的主要優點在于客戶端不必知道產品內部組成的細節,將產品本身與產品的創建過程解耦,使得相同的創建過程可以創建不同的產品對象,每一個具體建造者都相對獨立,而與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者,符合“開閉原則”,還可以更加精細地控制產品的創建過程;其主要缺點在于由于建造者模式所創建的產品一般具有較多的共同點,其組成部分相似,因此其使用范圍受到一定的限制,如果產品的內部變化復雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。
第八章
原型模式
1.定義:
原型模式:原型模式是一種對象創建型模式,用原型實例指定創建對象的種類,并且通過復制這些原型創建新的對象。原型模式允許一個對象再創建另外一個可定制的對象,無須知道任何創建的細節。原型模式的基本工作原理是通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝原型自己來實現創建過程。
2.結構圖:
3.主要優缺點:
原型模式最大的優點在于可以快速創建很多相同或相似的對象,簡化對象的創建過程,還可以保存對象的一些中間狀態;其缺點在于需要為每一個類配備一個克隆方法,因此對已有類進行改造比較麻煩,需要修改其源代碼,并且在實現深克隆時需要編寫較為復雜的代碼。
第九章
單例模式
1.定義:單例模式:單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例,這個類稱為單例類,它提供全局訪問的方法。單例模式的要點有三個:一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。單例模式是一種對象創建型模式。單例模式又名單件模式或單態模式。
2.結構圖:
3.主要優缺點:
單例模式的主要優點在于提供了對唯一實例的受控訪問并可以節約系統資源;其主要缺點在于因為缺少抽象層而難以擴展,且單例類職責過重。
第十章
適配器模式
補充:結構型模式概述:
結構型模式(Structural
Pattern)描述如何將類或者對象結合在一起形成更大的結構,就像搭積木,可以通過簡單積木的組合形成復雜的、功能更為強大的結構。
結構型模式可以分為類結構型模式和對象結構型模式:類結構型模式關心類的組合,由多個類可以組合成一個更大的系統,在類結構型模式中一般只存在繼承關系和實現關系。對象結構型模式關心類與對象的組合,通過關聯關系使得在一個類中定義另一個類的實例對象,然后通過該對象調用其方法。根據“合成復用原則”,在系統中盡量使用關聯關系來替代繼承關系,因此大部分結構型模式都是對象結構型模式。
1.定義:適配器模式:將一個接口轉換成客戶希望的另一個接口,適配器模式使接口不兼容的那些類可以一起工作,其別名為包裝器。適配器模式既可以作為類結構型模式,也可以作為對象結構型模式。
2.結構圖:
3.主要優缺點:
適配器模式的主要優點是將目標類和適配者類解耦,增加了類的透明性和復用性,同時系統的靈活性和擴展性都非常好,更換適配器或者增加新的適配器都非常方便,符合“開閉原則”;類適配器模式的缺點是適配器類在很多編程語言中不能同時適配多個適配者類,對象適配器模式的缺點是很難置換適配者類的方法。
第十一章
橋接模式
1.定義:橋接模式:將抽象部分與它的實現部分分離,使它們都可以獨立地變化。它是一種對象結構型模式,又稱為柄體模式或接口模式。
2.結構圖:
3.主要優缺點:
橋接模式的主要優點是分離抽象接口及其實現部分,是比多繼承方案更好的解決方法,橋接模式還提高了系統的可擴充性,在兩個變化維度中任意擴展一個維度,都不需要修改原有系統,實現細節對客戶透明,可以對用戶隱藏實現細節;其主要缺點是增加系統的理解與設計難度,且識別出系統中兩個獨立變化的維度并不是一件容易的事情。
第十二章
組合模式
1.定義:組合模式:組合多個對象形成樹形結構以表示“整體-部分”的結構層次。組合模式對單個對象(即葉子對象)和組合對象(即容器對象)的使用具有一致性。組合模式又可以稱為“整體-部分”模式,屬于對象的結構模式,它將對象組織到樹結構中,可以用來描述整體與部分的關系。
2.結構圖:
3.主要優缺點:
組合模式的主要優點在于可以方便地對層次結構進行控制,客戶端調用簡單,客戶端可以一致的使用組合結構或其中單個對象,用戶就不必關心自己處理的是單個對象還是整個組合結構,簡化了客戶端代碼;其缺點在于使設計變得更加抽象,且增加新構件時可能會產生一些問題,而且很難對容器中的構件類型進行限制。
第十三章
裝飾模式
1.定義:裝飾模式:動態地給一個對象增加一些額外的職責,就增加對象功能來說,裝飾模式比生成子類實現更為靈活。其別名也可以稱為包裝器,與適配器模式的別名相同,但它們適用于不同的場合。根據翻譯的不同,裝飾模式也有人稱之為“油漆工模式”,它是一種對象結構型模式。
2.結構圖:
3.主要優缺點:
裝飾模式的主要優點在于可以提供比繼承更多的靈活性,可以通過一種動態的方式來擴展一個對象的功能,并通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創造出很多不同行為的組合,而且具體構件類與具體裝飾類可以獨立變化,用戶可以根據需要增加新的具體構件類和具體裝飾類;其主要缺點在于使用裝飾模式進行系統設計時將產生很多小對象,而且裝飾模式比繼承更加易于出錯,排錯也很困難,對于多次裝飾的對象,調試時尋找錯誤可能需要逐級排查,較為煩瑣。
第十四章
外觀模式
1.定義:外觀模式:外部與一個子系統的通信必須通過一個統一的外觀對象進行,為子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。外觀模式又稱為門面模式,它是一種對象結構型模式。
2.結構圖:
3.主要優缺點:
外觀模式主要優點在于對客戶屏蔽子系統組件,減少了客戶處理的對象數目并使得子系統使用起來更加容易,它實現了子系統與客戶之間的松耦合關系,并降低了大型軟件系統中的編譯依賴性,簡化了系統在不同平臺之間的移植過程;其缺點在于不能很好地限制客戶使用子系統類,而且在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。
第十五章
享元模式
1.定義:享元模式:運用共享技術有效地支持大量細粒度對象的復用。系統只使用少量的對象,而這些對象都很相似,狀態變化很小,可以實現對象的多次復用。由于享元模式要求能夠共享的對象必須是細粒度對象,因此它又稱為輕量級模式,它是一種對象結構型模式。
2.結構圖:
3.主要優缺點:
享元模式主要優點在于它可以極大減少內存中對象的數量,使得相同對象或相似對象在內存中只保存一份;其缺點是使得系統更加復雜,并且需要將享元對象的狀態外部化,而讀取外部狀態使得運行時間變長。
第十六章
代理模式
1.定義:
代理模式:給某一個對象提供一個代理,并由代理對象控制對原對象的引用。代理模式的英文叫做Proxy或Surrogate,它是一種對象結構型模式。
2.結構圖:
3.主要優缺點:
代理模式的優點在于能夠協調調用者和被調用者,在一定程度上降低了系統的耦合度;其缺點在于由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢,并且實現代理模式需要額外的工作,有些代理模式的實現非常復雜。
第十七章
職責鏈模式
補充:行為型模式概述:
行為型模式是對在不同的對象之間劃分責任和算法的抽象化。行為型模式不僅僅關注類和對象的結構,而且重點關注它們之間的相互作用。通過行為型模式,可以更加清晰地劃分類與對象的職責,并研究系統在運行時實例對象之間的交互。在系統運行時,對象并不是孤立的,它們可以通過相互通信與協作完成某些復雜功能,一個對象在運行時也將影響到其他對象的運行。
行為型模式分為類行為型模式和對象行為型模式兩種:
(1)類行為型模式:類的行為型模式使用繼承關系在幾個類之間分配行為,類行為型模式主要通過多態等方式來分配父類與子類的職責。
(2)對象行為型模式:對象的行為型模式則使用對象的聚合關聯關系來分配行為,對象行為型模式主要是通過對象關聯等方式來分配兩個或多個類的職責。根據“合成復用原則”,系統中要盡量使用關聯關系來取代繼承關系,因此大部分行為型設計模式都屬于對象行為型設計模式。
1.定義:
職責鏈模式:避免請求發送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。由于英文翻譯的不同,職責鏈模式又稱為責任鏈模式,它是一種對象行為型模式。
2.結構圖:
3.主要優缺點:
職責鏈模式的主要優點在于可以降低系統的耦合度,簡化對象的相互連接,同時增強給對象指派職責的靈活性,增加新的請求處理類也很方便;其主要缺點在于不能保證請求一定被接收,且對于比較長的職責鏈,請求的處理可能涉及到多個處理對象,系統性能將受到一定影響,而且在進行代碼調試時不太方便。
第十八章
命令模式
1.定義:
命令模式:將一個請求封裝為一個對象,從而使我們可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。命令模式是一種對象行為型模式,其別名為動作模式或事務模式。
2.結構圖:
3.主要優缺點:
命令模式的主要優點在于降低系統的耦合度,增加新的命令很方便,而且可以比較容易地設計一個命令隊列和宏命令,并方便地實現對請求的撤銷和恢復;其主要缺點在于可能會導致某些系統有過多的具體命令類。
第十九章
解釋器模式
1.定義:
解釋器模式:定義語言的文法,并且建立一個解釋器來解釋該語言中的句子,這里的“語言”意思是使用規定格式和語法的代碼,它是一種類行為型模式。
2.結構圖:
3.主要優缺點:
解釋器模式的主要優點包括易于改變和擴展文法,易于實現文法并增加了新的解釋表達式的方式;其主要缺點是對于復雜文法難以維護,執行效率較低且應用場景很有限。
第二十章
迭代器模式
1.定義:
迭代器模式:提供一種方法來訪問聚合對象,而不用暴露這個對象的內部表示,其別名為游標。迭代器模式是一種對象行為型模式。
2.結構圖:
3.主要優缺點:
迭代器模式的主要優點在于它支持以不同的方式遍歷一個聚合對象,還簡化了聚合類,而且在同一個聚合上可以有多個遍歷;其缺點在于增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的復雜性。
第二十一章
中介者模式
1.定義:
中介者模式定義:用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。中介者模式又稱為調停者模式,它是一種對象行為型模式。
2.結構圖:
3.主要優缺點:
中介者模式的主要優點在于簡化了對象之間的交互,將各同事解耦,還可以減少子類生成,對于復雜的對象之間的交互,通過引入中介者,可以簡化各同事類的設計和實現;中介者模式主要缺點在于具體中介者類中包含了同事之間的交互細節,可能會導致具體中介者類非常復雜,使得系統難以維護。
第二十二章
備忘錄模式
1.定義:
備忘錄模式:在不破壞封裝的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態,這樣可以在以后將對象恢復到原先保存的狀態。它是一種對象行為型模式,其別名為Token。
2.結構圖:
3.主要優缺點:
備忘錄模式的主要優點在于它提供了一種狀態恢復的實現機制,使得用戶可以方便地回到一個特定的歷史步驟,還簡化了原發器對象,備忘錄只保存原發器的狀態,采用堆棧來存儲備忘錄對象可以實現多次撤消操作,可以通過在負責人中定義集合對象來存儲多個備忘錄;備忘錄模式的主要缺點在于資源消耗過大,因為每一個歷史狀態的保存都需要一個備忘錄對象。
第二十三章
觀察者模式
1.定義:
觀察者模式:定義對象間的一種一對多依賴關系,使得每當一個對象狀態發生改變時,其相關依賴對象皆得到通知并被自動更新。觀察者模式又叫做發布-訂閱模式、模型-視圖模式、源-監聽器模式或從屬者模式。觀察者模式是一種對象行為型模式。
2.結構圖:
3.主要優缺點:
觀察者模式的主要優點在于可以實現表示層和數據邏輯層的分離,并在觀察目標和觀察者之間建立一個抽象的耦合,支持廣播通信;其主要缺點在于如果一個觀察目標對象有很多直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間,而且如果在觀察者和觀察目標之間有循環依賴的話,觀察目標會觸發它們之間進行循環調用,可能導致系統崩潰。
第二十四章
狀態模式
1.定義:
狀態模式:允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。其別名為狀態對象,狀態模式是一種對象行為型模式。
2.結構圖:
3.主要優缺點:
狀態模式的主要優點在于封裝了轉換規則,并枚舉可能的狀態,它將所有與某個狀態有關的行為放到一個類中,并且可以方便地增加新的狀態,只需要改變對象狀態即可改變對象的行為,還可以讓多個環境對象共享一個狀態對象,從而減少系統中對象的個數;其缺點在于使用狀態模式會增加系統類和對象的個數,且狀態模式的結構與實現都較為復雜,如果使用不當將導致程序結構和代碼的混亂,對于可以切換狀態的狀態模式不滿足“開閉原則”的要求。
第二十五章
策略模式
1.定義:
策略模式:定義一系列算法,將每一個算法封裝起來,并讓它們可以相互替換。策略模式讓算法獨立于使用它的客戶而變化,也稱為政策模式。策略模式是一種對象行為型模式。
2.結構圖:
3.主要優缺點:
策略模式主要優點在于對“開閉原則”的完美支持,在不修改原有系統的基礎上可以更換算法或者增加新的算法,它很好地管理算法族,提高了代碼的復用性,是一種替換繼承,避免多重條件轉移語句的實現方式;其缺點在于客戶端必須知道所有的策略類,并理解其區別,同時在一定程度上增加了系統中類的個數,可能會存在很多策略類。
第二十六章
模板方法模式
1.定義:
模板方法模式:定義一個操作中算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。模板方法是一種類行為型模式。
2.結構圖:
3.主要優缺點:
模板方法模式的優點在于在子類定義詳細的處理算法時不會改變算法的結構,實現了代碼的復用,通過對子類的擴展可以增加新的行為,符合“開閉原則”;其缺點在于需要為每個不同的實現都定義一個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象。
第二十七章
訪問者模式
1.定義:
訪問者模式:表示一個作用于某對象結構中的各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。訪問者模式是一種對象行為型模式。
2.結構圖:
3.主要優缺點:
訪問者模式的主要優點在于使得增加新的訪問操作變得很容易,將有關元素對象的訪問行為集中到一個訪問者對象中,而不是分散到一個個的元素類中,還可以跨過類的等級結構訪問屬于不同的等級結構的元素類,讓用戶能夠在不修改現有類層次結構的情況下,定義該類層次結構的操作;其主要缺點在于增加新的元素類很困難,而且在一定程度上破壞系統的封裝性。