第六章設(shè)計模式引言_第1頁
第六章設(shè)計模式引言_第2頁
第六章設(shè)計模式引言_第3頁
第六章設(shè)計模式引言_第4頁
第六章設(shè)計模式引言_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第六章第六章 設(shè)計模式引言設(shè)計模式引言6.1 設(shè)計目標(biāo)設(shè)計目標(biāo) 健壯性健壯性 靈活性靈活性 可重用性可重用性6.2 設(shè)計原則設(shè)計原則 面向接口編程的原則面向接口編程的原則面向面向接口接口編程,而不是面向編程,而不是面向?qū)崿F(xiàn)實現(xiàn)編程。編程。 可變性封裝的原則可變性封裝的原則 開閉原則開閉原則 里氏替換原則里氏替換原則 組合組合/ /聚合復(fù)用原則聚合復(fù)用原則盡量使用組合盡量使用組合/ /聚合、盡量不使用繼承聚合、盡量不使用繼承設(shè)計原則(續(xù))設(shè)計原則(續(xù)) 接口隔離原則接口隔離原則 避免接口污染;避免接口污染; 依賴倒轉(zhuǎn)原則依賴倒轉(zhuǎn)原則 高層模塊不應(yīng)該依賴于低層模塊。二高層模塊不應(yīng)該依賴于低層模塊。

2、二者都應(yīng)該依賴于抽象。者都應(yīng)該依賴于抽象。 抽象不應(yīng)該依賴于細(xì)節(jié)。細(xì)節(jié)應(yīng)該依抽象不應(yīng)該依賴于細(xì)節(jié)。細(xì)節(jié)應(yīng)該依賴于抽象。賴于抽象。 6.3 關(guān)于模式關(guān)于模式 模式描述了一個在我們的環(huán)境中不斷出現(xiàn)的模式描述了一個在我們的環(huán)境中不斷出現(xiàn)的問題,然后描述了該問題的解決方案的核心。問題,然后描述了該問題的解決方案的核心。通過這種方式,你可以無數(shù)次地使用那些已通過這種方式,你可以無數(shù)次地使用那些已有的解決方案,無需再重復(fù)相同的工作。有的解決方案,無需再重復(fù)相同的工作。 建筑的永恒之道建筑的永恒之道 Christopher Alexander關(guān)于模式(續(xù))關(guān)于模式(續(xù)) 模式其實就是解決某一類問題的方法論。

3、模式其實就是解決某一類問題的方法論。 把解決某類問題的方法總結(jié)歸納到理論高度,把解決某類問題的方法總結(jié)歸納到理論高度,那就是模式。那就是模式。 模式對問題的描述以及對問題的解答應(yīng)具有模式對問題的描述以及對問題的解答應(yīng)具有高度的抽象性和代表性。高度的抽象性和代表性。 模式是對現(xiàn)實生活某類現(xiàn)象的共同特質(zhì)的高模式是對現(xiàn)實生活某類現(xiàn)象的共同特質(zhì)的高度抽象,描述了事務(wù)或者現(xiàn)象的規(guī)律,這種度抽象,描述了事務(wù)或者現(xiàn)象的規(guī)律,這種規(guī)律以及解決方法對于類似的現(xiàn)象同樣有用。規(guī)律以及解決方法對于類似的現(xiàn)象同樣有用。軟件的設(shè)計模式軟件的設(shè)計模式 指在軟件設(shè)計和開發(fā)過程中,不斷總結(jié)出來指在軟件設(shè)計和開發(fā)過程中,不斷總結(jié)

4、出來的,反應(yīng)了某一類設(shè)計問題的解決方案。的,反應(yīng)了某一類設(shè)計問題的解決方案。 模式是一種指導(dǎo),在一個良好的指導(dǎo)下,有模式是一種指導(dǎo),在一個良好的指導(dǎo)下,有助于你完成任務(wù),有助于你作出一個優(yōu)良的助于你完成任務(wù),有助于你作出一個優(yōu)良的設(shè)計方案,達(dá)到事半功倍的效果。而且會得設(shè)計方案,達(dá)到事半功倍的效果。而且會得到解決問題的最佳辦法。到解決問題的最佳辦法。 設(shè)計模式使人們可以更加簡單方便地復(fù)用成設(shè)計模式使人們可以更加簡單方便地復(fù)用成功的設(shè)計和體系結(jié)構(gòu)。功的設(shè)計和體系結(jié)構(gòu)。幾個概念的區(qū)分 模式: 設(shè)計模式: 框架: 架構(gòu):GoF(Gang of Four,四人幫四人幫) Erich Gamma:在蘇黎世

5、大學(xué)獲得計算機科學(xué)博士學(xué)位,在蘇黎世大學(xué)獲得計算機科學(xué)博士學(xué)位,曾供職于瑞士聯(lián)邦銀行、曾供職于瑞士聯(lián)邦銀行、Taligent、OTI公司。現(xiàn)在是公司?,F(xiàn)在是Eclipse項目的主要技術(shù)負(fù)責(zé)人之一。項目的主要技術(shù)負(fù)責(zé)人之一。 Richard Helm:在墨爾本大學(xué)獲得計算機科學(xué)博士學(xué)在墨爾本大學(xué)獲得計算機科學(xué)博士學(xué)位,曾在位,曾在IBM T.J.Watson擔(dān)任研究員?,F(xiàn)在擔(dān)任研究員?,F(xiàn)在IBM咨詢集團(tuán)供咨詢集團(tuán)供職。職。 Ralph Johnson:在康內(nèi)爾大學(xué)獲得計算機科學(xué)博士在康內(nèi)爾大學(xué)獲得計算機科學(xué)博士學(xué)位,目前是伊利諾大學(xué)教授,在模式、重構(gòu)等領(lǐng)域均有很學(xué)位,目前是伊利諾大學(xué)教授,在模式

6、、重構(gòu)等領(lǐng)域均有很高造詣。高造詣。 John Vlissides:在斯坦福大學(xué)獲得計算機科學(xué)在斯坦福大學(xué)獲得計算機科學(xué)博士學(xué)位,目前是博士學(xué)位,目前是IBM T.J.Watson研究中心的研究員。研究中心的研究員。6.4 為什么我們要使用設(shè)計模式?為什么我們要使用設(shè)計模式? 設(shè)計模式幫助你從別人的成功經(jīng)驗而不是你設(shè)計模式幫助你從別人的成功經(jīng)驗而不是你自己的失敗那里學(xué)到更多東西;自己的失敗那里學(xué)到更多東西; - - Mark JohnsonMark Johnson 設(shè)計模式提供了一種共享經(jīng)驗的方式,可以設(shè)計模式提供了一種共享經(jīng)驗的方式,可以使團(tuán)體受益和避免不斷的重復(fù)發(fā)明。使團(tuán)體受益和避免不斷的重

7、復(fù)發(fā)明。6.5 模式的四個基本要素模式的四個基本要素模式名稱(模式名稱(pattern namepattern name) 一個助記名,它用一個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。一兩個詞來描述模式的問題、解決方案和效果。命名一個新的模式增加了我們的設(shè)計詞匯。設(shè)計模式命名一個新的模式增加了我們的設(shè)計詞匯。設(shè)計模式允許我們在較高的抽象層次上進(jìn)行設(shè)計。基于一個模允許我們在較高的抽象層次上進(jìn)行設(shè)計。基于一個模式詞匯表,我們自己以及同事之間就可以討論模式并式詞匯表,我們自己以及同事之間就可以討論模式并在編寫文檔時使用它們。在編寫文檔時使用它們。模式名可以幫助我們思考,便于我們與其他人

8、交流設(shè)模式名可以幫助我們思考,便于我們與其他人交流設(shè)計思想及設(shè)計結(jié)果。計思想及設(shè)計結(jié)果。找到恰當(dāng)?shù)哪J矫彩俏覀冊O(shè)計模式編目工作的難點找到恰當(dāng)?shù)哪J矫彩俏覀冊O(shè)計模式編目工作的難點之一。之一。模式的四個基本要素(續(xù))模式的四個基本要素(續(xù))問題問題(problem)(problem) 描述了應(yīng)該在描述了應(yīng)該在何時何時使用模使用模式。式。它解釋了設(shè)計問題和問題存在的前因后果,它可它解釋了設(shè)計問題和問題存在的前因后果,它可能描述了特定的設(shè)計問題,如怎樣用對象表示能描述了特定的設(shè)計問題,如怎樣用對象表示算法等。算法等。也可能描述了導(dǎo)致不靈活設(shè)計的類或?qū)ο蠼Y(jié)構(gòu)。也可能描述了導(dǎo)致不靈活設(shè)計的類或?qū)ο蠼Y(jié)構(gòu)

9、。有時候,問題部分會包括使用模式必須滿足的一有時候,問題部分會包括使用模式必須滿足的一系列先決條件。系列先決條件。模式的四個基本要素(續(xù))模式的四個基本要素(續(xù))解決方案解決方案(solution)(solution) 描述了設(shè)計的描述了設(shè)計的組成成組成成分分,它們之間的相互關(guān)系及各自的職責(zé)和,它們之間的相互關(guān)系及各自的職責(zé)和協(xié)作方式。協(xié)作方式。 因為模式就像一個模板,可應(yīng)用于多種不同場因為模式就像一個模板,可應(yīng)用于多種不同場合,所以解決方案并不描述一個特定而具體的合,所以解決方案并不描述一個特定而具體的設(shè)計或?qū)崿F(xiàn),而是提供設(shè)計問題的抽象描述和設(shè)計或?qū)崿F(xiàn),而是提供設(shè)計問題的抽象描述和怎樣用一個

10、具有一般意義的元素組合(類或?qū)υ鯓佑靡粋€具有一般意義的元素組合(類或?qū)ο蠼M合)來解決這個問題。象組合)來解決這個問題。模式的四個基本要素(續(xù))模式的四個基本要素(續(xù))效果效果(consequences)(consequences) 描述了模式應(yīng)用的描述了模式應(yīng)用的效果及效果及使用模式應(yīng)權(quán)衡的問題使用模式應(yīng)權(quán)衡的問題。盡管我們描述設(shè)計決策時,并不總提到模式效果,但它盡管我們描述設(shè)計決策時,并不總提到模式效果,但它們對于評價設(shè)計選擇和理解使用模式的代價及好處具們對于評價設(shè)計選擇和理解使用模式的代價及好處具有重要意義。有重要意義。軟件效果大多關(guān)注對時間和空間的衡量,它們也表述了軟件效果大多關(guān)注對時間

11、和空間的衡量,它們也表述了語言和實現(xiàn)問題。語言和實現(xiàn)問題。因為因為復(fù)用復(fù)用是面向?qū)ο笤O(shè)計的要素之一,所以模式效果包是面向?qū)ο笤O(shè)計的要素之一,所以模式效果包括括它對系統(tǒng)的靈活性、擴充性或可移植性的影響它對系統(tǒng)的靈活性、擴充性或可移植性的影響,顯,顯式地列出這些效果對理解和評價這些模式很有幫助。式地列出這些效果對理解和評價這些模式很有幫助。6.6 描述設(shè)計模式描述設(shè)計模式 為了達(dá)到設(shè)計復(fù)用,必須同時記錄設(shè)計產(chǎn)為了達(dá)到設(shè)計復(fù)用,必須同時記錄設(shè)計產(chǎn)生的決定過程、選擇過程和權(quán)衡過程。具生的決定過程、選擇過程和權(quán)衡過程。具體的例子也是很重要的,它們讓你看到實體的例子也是很重要的,它們讓你看到實際的設(shè)計。際

12、的設(shè)計。 將用統(tǒng)一的格式描述設(shè)計模式,每一個模將用統(tǒng)一的格式描述設(shè)計模式,每一個模式根據(jù)以下的模板被分為若干部分。式根據(jù)以下的模板被分為若干部分。描述設(shè)計模式(續(xù))描述設(shè)計模式(續(xù)) 模式名和分類:模式名和分類:模式名簡潔地描述了模式的模式名簡潔地描述了模式的本質(zhì)。一個好的名字非常重要,因為它將成本質(zhì)。一個好的名字非常重要,因為它將成為你的設(shè)計詞匯表中的一部分。為你的設(shè)計詞匯表中的一部分。 意圖:意圖:是回答下列問題的簡單陳述:設(shè)計模是回答下列問題的簡單陳述:設(shè)計模式是做什么的?它的基本原理和意圖是什么?式是做什么的?它的基本原理和意圖是什么?它解決的是什么樣的特定設(shè)計問題?它解決的是什么樣的

13、特定設(shè)計問題?描述設(shè)計模式(續(xù))描述設(shè)計模式(續(xù)) 別名:別名:模式的其他名稱。模式的其他名稱。 動機:動機:用以說明一個設(shè)計問題以及如何用模用以說明一個設(shè)計問題以及如何用模式中的類、對象來解決該問題的特定情景。式中的類、對象來解決該問題的特定情景。該情景會幫助你理解隨后對模式更抽象的描該情景會幫助你理解隨后對模式更抽象的描述。述。 適用性:適用性:什么情況下可以使用該設(shè)計模式?什么情況下可以使用該設(shè)計模式?該模式可用來改進(jìn)哪些不良設(shè)計?你怎樣識該模式可用來改進(jìn)哪些不良設(shè)計?你怎樣識別這些情況?別這些情況?描述設(shè)計模式(續(xù))描述設(shè)計模式(續(xù)) 結(jié)構(gòu):結(jié)構(gòu):采用基于對象建模技術(shù)(采用基于對象建模

14、技術(shù)( O M T)的)的表示法對模式中的類進(jìn)行圖形描述。我們也表示法對模式中的類進(jìn)行圖形描述。我們也使用了交互圖來說明對象之間的請求序列和使用了交互圖來說明對象之間的請求序列和協(xié)作關(guān)系。協(xié)作關(guān)系。 參與者:參與者:指設(shè)計模式中的類和指設(shè)計模式中的類和/或?qū)ο笠约八驅(qū)ο笠约八鼈兏髯缘穆氊?zé)。們各自的職責(zé)。 協(xié)作:協(xié)作:模式的參與者怎樣協(xié)作以實現(xiàn)它們的模式的參與者怎樣協(xié)作以實現(xiàn)它們的職責(zé)。職責(zé)。描述設(shè)計模式(續(xù))描述設(shè)計模式(續(xù)) 效果:效果:模式怎樣支持它的目標(biāo)?使用模式的模式怎樣支持它的目標(biāo)?使用模式的效果和所需做的權(quán)衡取舍?系統(tǒng)結(jié)構(gòu)的哪些效果和所需做的權(quán)衡取舍?系統(tǒng)結(jié)構(gòu)的哪些方面可以獨立改

15、變?方面可以獨立改變? 實現(xiàn):實現(xiàn):實現(xiàn)模式時需要知道的一些提示、技實現(xiàn)模式時需要知道的一些提示、技術(shù)要點及應(yīng)避免的缺陷,以及是否存在某些術(shù)要點及應(yīng)避免的缺陷,以及是否存在某些特定于實現(xiàn)語言的問題。特定于實現(xiàn)語言的問題。描述設(shè)計模式(續(xù))描述設(shè)計模式(續(xù)) 代碼示例:代碼示例:用來說明怎樣用用來說明怎樣用C+或或Smalltalk實實現(xiàn)該模式的代碼片段。現(xiàn)該模式的代碼片段。 已知應(yīng)用:已知應(yīng)用:實際系統(tǒng)中發(fā)現(xiàn)的模式的例子。實際系統(tǒng)中發(fā)現(xiàn)的模式的例子。每個模式至少包括了兩個不同領(lǐng)域的實例。每個模式至少包括了兩個不同領(lǐng)域的實例。 相關(guān)模式:相關(guān)模式:與這個模式緊密相關(guān)的模式有哪與這個模式緊密相關(guān)的

16、模式有哪些?其間重要的不同之處是什么?這個模式些?其間重要的不同之處是什么?這個模式應(yīng)與哪些其他模式一起使用?應(yīng)與哪些其他模式一起使用?6.7 設(shè)計模式目錄設(shè)計模式目錄 Abstract Factory(抽象工廠)(抽象工廠):提供一個:提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。無需指定它們具體的類。 Adapter(適配器)(適配器) :將一個類的接口轉(zhuǎn)換:將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。成客戶希望的另外一個接口。Adapter模式模式使得原本由于接口不兼容而不能一起工作的使得原本由于接口不兼容而不能一起工作的那些類

17、可以一起工作。那些類可以一起工作。設(shè)計模式目錄(續(xù))設(shè)計模式目錄(續(xù)) Bridge(橋)(橋):將抽象部分與它的實現(xiàn)部分分離,:將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化。使它們都可以獨立地變化。 Builder(生成器)(生成器):將一個復(fù)雜對象的構(gòu)建與它:將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。表示。 Chain of Responsibility(職責(zé)鏈)(職責(zé)鏈):為解除請求:為解除請求的發(fā)送者和接收者之間耦合,而使多個對象都有機的發(fā)送者和接收者之間耦合,而使多個對象都有機會處理這個請求。將這些對

18、象連成一條鏈,并沿著會處理這個請求。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它。這條鏈傳遞該請求,直到有一個對象處理它。設(shè)計模式目錄(續(xù))設(shè)計模式目錄(續(xù)) Command(命令)(命令):將一個請求封裝為一個對象,將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進(jìn)行參數(shù)化;對請從而使你可用不同的請求對客戶進(jìn)行參數(shù)化;對請求排隊或記錄請求日志,以及支持可取消的操作。求排隊或記錄請求日志,以及支持可取消的操作。 Composite(組合)(組合):將對象組合成樹形結(jié)構(gòu)以表將對象組合成樹形結(jié)構(gòu)以表示示“部分部分-整體整體”的層次結(jié)構(gòu)。的層次結(jié)構(gòu)。Composite使得

19、客戶使得客戶對單個對象和復(fù)合對象的使用具有一致性。對單個對象和復(fù)合對象的使用具有一致性。 Decorator(裝飾)(裝飾):動態(tài)地給一個對象添加一些動態(tài)地給一個對象添加一些額外的職責(zé)。就擴展功能而言,額外的職責(zé)。就擴展功能而言, Decorator 模式模式比生成子類方式更為靈活。比生成子類方式更為靈活。設(shè)計模式目錄(續(xù))設(shè)計模式目錄(續(xù)) Faade(外觀)(外觀):為子系統(tǒng)中的一組接口提供一個為子系統(tǒng)中的一組接口提供一個一致的界面,一致的界面, Faade 模式定義了一個高層接口,模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。這個接口使得這一子系統(tǒng)更加容易使用。 Facto

20、ry Method(工廠方法)(工廠方法):定義一個用于創(chuàng)建定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類實例化。對象的接口,讓子類決定將哪一個類實例化。Factory Method使一個類的實例化延遲到其子類。使一個類的實例化延遲到其子類。 Flyweight(享元)(享元):運用共享技術(shù)有效地支持大量運用共享技術(shù)有效地支持大量細(xì)粒度的對象。細(xì)粒度的對象。 Interpreter(解釋器)(解釋器):給定一個語言給定一個語言, 定義它的文定義它的文法的一種表示,并定義一個解釋器法的一種表示,并定義一個解釋器, 該解釋器使用該該解釋器使用該表示來解釋語言中的句子。表示來解釋語言中的句子。設(shè)計

21、模式目錄(續(xù))設(shè)計模式目錄(續(xù)) Iterator(迭代器)(迭代器):提供一種方法順序訪問一個聚合提供一種方法順序訪問一個聚合對象中各個元素對象中各個元素, 而又不需暴露該對象的內(nèi)部表示。而又不需暴露該對象的內(nèi)部表示。 Mediator(中介者)(中介者):用一個中介對象來封裝一系列用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的從而使其耦合松散,而且可以獨立地改變它們之間的交互。交互。 Memento(備忘錄)(備忘錄):在不破壞封裝性的前提下,捕在不破壞封裝性的前提下,

22、捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到保存的狀態(tài)。態(tài)。這樣以后就可將該對象恢復(fù)到保存的狀態(tài)。設(shè)計模式目錄(續(xù))設(shè)計模式目錄(續(xù)) Observer(觀察者)(觀察者):定義對象間的一種一對定義對象間的一種一對多的依賴關(guān)系多的依賴關(guān)系,以便當(dāng)一個對象的狀態(tài)發(fā)生改變以便當(dāng)一個對象的狀態(tài)發(fā)生改變時時,所有依賴于它的對象都得到通知并自動刷新。所有依賴于它的對象都得到通知并自動刷新。 Prototype(原型)(原型):用原型實例指定創(chuàng)建對:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這個原型來創(chuàng)建新的象的種類,并且通過

23、拷貝這個原型來創(chuàng)建新的對象。對象。 Proxy(代理)(代理):為其他對象提供一個代理以:為其他對象提供一個代理以控制對這個對象的訪問??刂茖@個對象的訪問。設(shè)計模式目錄(續(xù))設(shè)計模式目錄(續(xù)) Singleton(單件)(單件):保證一個類僅有一個實:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。例,并提供一個訪問它的全局訪問點。 State(狀態(tài))(狀態(tài)):允許一個對象在其內(nèi)部狀態(tài):允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象看起來似乎修改改變時改變它的行為。對象看起來似乎修改了它所屬的類。了它所屬的類。 Strategy (策略):定義一系列的算法(策略):定義一系列的算法,

24、把它把它們一個個封裝起來們一個個封裝起來, 并且使它們可相互替換。并且使它們可相互替換。本模式使得算法的變化可獨立于使用它的客本模式使得算法的變化可獨立于使用它的客戶。戶。設(shè)計模式目錄(續(xù))設(shè)計模式目錄(續(xù)) Template Method(模板方法)(模板方法):定義一個定義一個操作中的算法的骨架,而將一些步驟延遲到操作中的算法的骨架,而將一些步驟延遲到子類中。子類中。Template Method使得子類可以不使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。些特定步驟。 Visitor(訪問者)(訪問者):表示一個作用于某對象:表示一個

25、作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素變各元素的類的前提下定義作用于這些元素的新操作。的新操作。6.8 設(shè)計模式分類設(shè)計模式分類根據(jù)兩條準(zhǔn)則對模式進(jìn)行分類:根據(jù)兩條準(zhǔn)則對模式進(jìn)行分類:目的目的,即模式是用來完成什么工作的。,即模式是用來完成什么工作的。創(chuàng)建型(創(chuàng)建型(Creational):與對象的創(chuàng)建有關(guān),以靈活的方式創(chuàng)建):與對象的創(chuàng)建有關(guān),以靈活的方式創(chuàng)建對象的集合;對象的集合;結(jié)構(gòu)型結(jié)構(gòu)型( Structural ):處理類或?qū)ο蟮慕M合,代表相關(guān)對象的集:處理類或?qū)ο蟮慕M合,代表相關(guān)對象的集合;合;

26、行為型行為型( Behavioral ):對類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)進(jìn):對類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)進(jìn)行描述,在對象集合中捕獲行為。行描述,在對象集合中捕獲行為。范圍范圍,指定模式主要是用于,指定模式主要是用于類類還是用于還是用于對象對象。類模式處理類和子類之間的關(guān)系,這些關(guān)系通過繼承建立,是靜類模式處理類和子類之間的關(guān)系,這些關(guān)系通過繼承建立,是靜態(tài)的,在編譯時刻便確定下來了。態(tài)的,在編譯時刻便確定下來了。對象模式處理對象間的關(guān)系,這些關(guān)系在運行時刻是可以變化的,對象模式處理對象間的關(guān)系,這些關(guān)系在運行時刻是可以變化的,更具動態(tài)性。更具動態(tài)性。從某種意義上來說,幾乎所有模式都使用繼

27、承機制,所以從某種意義上來說,幾乎所有模式都使用繼承機制,所以“類模類模式式”只指那些只指那些集中于處理類間關(guān)系的模式集中于處理類間關(guān)系的模式,而大部分模式都屬于,而大部分模式都屬于對象模式的范疇。對象模式的范疇。設(shè)計模式空間設(shè)計模式空間 目目 的的 創(chuàng)建型創(chuàng)建型 結(jié)構(gòu)型結(jié)構(gòu)型 行為型行為型范圍范圍類類Factory Method Adapter (類類) Interpreter Template Method 對象對象Abstract Factory Adapter (對象對象) Chain of Responsibility Builder Bridge Command Prototype

28、 Composite Iterator Singleton Decorator Mediator Facade Memento Flyweight Observer Proxy State Strategy Visitor 設(shè)計模式之間的關(guān)設(shè)計模式之間的關(guān)系系設(shè)計模式所支持的設(shè)計的可變方面設(shè)計模式所支持的設(shè)計的可變方面設(shè)計模式所支持的設(shè)計的可變方面設(shè)計模式所支持的設(shè)計的可變方面6.9 怎樣使用設(shè)計模式怎樣使用設(shè)計模式1) 大致瀏覽一遍模式大致瀏覽一遍模式 特別注意其特別注意其適用性部分適用性部分和和效果效果部分部分,確定它適合你的問題。,確定它適合你的問題。2 ) 回頭研究結(jié)構(gòu)部分、參與者部分

29、和協(xié)作部分回頭研究結(jié)構(gòu)部分、參與者部分和協(xié)作部分 確保確保你理解這個模式的類和對象以及它們是怎樣關(guān)聯(lián)的。你理解這個模式的類和對象以及它們是怎樣關(guān)聯(lián)的。3 ) 看代碼示例部分,看看這個模式代碼形式的具體例看代碼示例部分,看看這個模式代碼形式的具體例子子 研究代碼將有助于你實現(xiàn)模式。研究代碼將有助于你實現(xiàn)模式。4 ) 選擇模式參與者的名字,使它們在應(yīng)用上下文中有選擇模式參與者的名字,使它們在應(yīng)用上下文中有意義意義 設(shè)計模式參與者的名字通常過于抽象而不會設(shè)計模式參與者的名字通常過于抽象而不會直接出現(xiàn)在應(yīng)用中。然而,將參與者的名字和應(yīng)用直接出現(xiàn)在應(yīng)用中。然而,將參與者的名字和應(yīng)用中出現(xiàn)的名字合并起來是

30、很有用的。這會幫助你在中出現(xiàn)的名字合并起來是很有用的。這會幫助你在實現(xiàn)中更顯式的體現(xiàn)出模式來。實現(xiàn)中更顯式的體現(xiàn)出模式來。怎樣使用設(shè)計模式(續(xù))怎樣使用設(shè)計模式(續(xù))5) 定義類定義類 聲明它們的接口,建立它們的繼承關(guān)系,聲明它們的接口,建立它們的繼承關(guān)系,定義代表數(shù)據(jù)和對象引用的實例變量。識別模式會定義代表數(shù)據(jù)和對象引用的實例變量。識別模式會影響到的你的應(yīng)用中存在的類,做出相應(yīng)的修改。影響到的你的應(yīng)用中存在的類,做出相應(yīng)的修改。6) 定義模式中專用于應(yīng)用的操作名稱定義模式中專用于應(yīng)用的操作名稱 這里再一次體這里再一次體現(xiàn)出,名字一般依賴于應(yīng)用。使用與每一個操作相現(xiàn)出,名字一般依賴于應(yīng)用。使用

31、與每一個操作相關(guān)聯(lián)的責(zé)任和協(xié)作作為指導(dǎo)。還有,你的名字約定關(guān)聯(lián)的責(zé)任和協(xié)作作為指導(dǎo)。還有,你的名字約定要一致。例如,可以使用要一致。例如,可以使用“Create-”前綴統(tǒng)一標(biāo)記前綴統(tǒng)一標(biāo)記Factory方法。方法。7) 實現(xiàn)執(zhí)行模式中責(zé)任和協(xié)作的操作實現(xiàn)執(zhí)行模式中責(zé)任和協(xié)作的操作 實現(xiàn)部分提供實現(xiàn)部分提供線索指導(dǎo)你進(jìn)行實現(xiàn)。代碼示例部分的例子也能提線索指導(dǎo)你進(jìn)行實現(xiàn)。代碼示例部分的例子也能提供幫助。供幫助。6.10 設(shè)計模式怎樣解決設(shè)計問題設(shè)計模式怎樣解決設(shè)計問題設(shè)計應(yīng)支持變化設(shè)計應(yīng)支持變化設(shè)計模式可以確保系統(tǒng)能以特定方式變化,從而幫設(shè)計模式可以確保系統(tǒng)能以特定方式變化,從而幫助避免重新設(shè)計系

32、統(tǒng)。助避免重新設(shè)計系統(tǒng)。每一個設(shè)計模式允許系統(tǒng)結(jié)構(gòu)的某個方面的變化獨每一個設(shè)計模式允許系統(tǒng)結(jié)構(gòu)的某個方面的變化獨立于其他方面,這樣產(chǎn)生的系統(tǒng)對于某一種特殊變立于其他方面,這樣產(chǎn)生的系統(tǒng)對于某一種特殊變化將更健壯?;瘜⒏?。設(shè)計模式怎樣解決設(shè)計問題(續(xù))設(shè)計模式怎樣解決設(shè)計問題(續(xù))導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式通過顯式地指定一個類來創(chuàng)建對象通過顯式地指定一個類來創(chuàng)建對象 在創(chuàng)建對象時指在創(chuàng)建對象時指定類名將使你受特定實現(xiàn)的約束而不是特定接口的約定類名將使你受特定實現(xiàn)的約束而不是特定接口的約束。這會使未來的變化更復(fù)雜。要避免這種情況,應(yīng)束。

33、這會使未來的變化更復(fù)雜。要避免這種情況,應(yīng)該間接地創(chuàng)建對象。該間接地創(chuàng)建對象。設(shè)計模式:設(shè)計模式: Abstract Factory,F(xiàn)actory Method,Prototype。設(shè)計模式怎樣解決設(shè)計問題(續(xù))設(shè)計模式怎樣解決設(shè)計問題(續(xù))導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式對特殊操作的依賴對特殊操作的依賴 當(dāng)你為請求指定一個特殊的操作當(dāng)你為請求指定一個特殊的操作時,完成該請求的方式就固定下來了。為避免把請求時,完成該請求的方式就固定下來了。為避免把請求代碼寫死,你將可以在編譯時刻或運行時刻很方便地代碼寫死,你將可以在編譯時刻或運行時刻很方便

34、地改變響應(yīng)請求的方法。改變響應(yīng)請求的方法。設(shè)計模式:設(shè)計模式: Chain of Responsibility,Command。設(shè)計模式怎樣解決設(shè)計問題(續(xù))設(shè)計模式怎樣解決設(shè)計問題(續(xù))導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式對硬件和軟件平臺的依賴對硬件和軟件平臺的依賴 外部的操作系統(tǒng)接口和應(yīng)外部的操作系統(tǒng)接口和應(yīng)用編程接口用編程接口( API )在不同的軟硬件平臺上是不同的。在不同的軟硬件平臺上是不同的。依賴于特定平臺的軟件將很難移植到其他平臺上,甚依賴于特定平臺的軟件將很難移植到其他平臺上,甚至都很難跟上本地平臺的更新。所以設(shè)計系統(tǒng)時限制至都很

35、難跟上本地平臺的更新。所以設(shè)計系統(tǒng)時限制其平臺相關(guān)性就很重要了。其平臺相關(guān)性就很重要了。設(shè)計模式:設(shè)計模式: Abstract Factory,Bridge。設(shè)計模式怎樣解決設(shè)計問題(續(xù))設(shè)計模式怎樣解決設(shè)計問題(續(xù))導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式對對象表示或?qū)崿F(xiàn)的依賴對對象表示或?qū)崿F(xiàn)的依賴 知道對象怎樣表示、保存、知道對象怎樣表示、保存、定位或?qū)崿F(xiàn)的客戶在對象發(fā)生變化時可能也需要變化。定位或?qū)崿F(xiàn)的客戶在對象發(fā)生變化時可能也需要變化。對客戶隱藏這些信息能阻止連鎖變化。對客戶隱藏這些信息能阻止連鎖變化。設(shè)計模式:設(shè)計模式: Abstract

36、Factory,Bridge,Memento,Proxy設(shè)計模式怎樣解決設(shè)計問題(續(xù))設(shè)計模式怎樣解決設(shè)計問題(續(xù))導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式對對象表示或?qū)崿F(xiàn)的依賴對對象表示或?qū)崿F(xiàn)的依賴 知道對象怎樣表示、保存、知道對象怎樣表示、保存、定位或?qū)崿F(xiàn)的客戶在對象發(fā)生變化時可能也需要變化。定位或?qū)崿F(xiàn)的客戶在對象發(fā)生變化時可能也需要變化。對客戶隱藏這些信息能阻止連鎖變化。對客戶隱藏這些信息能阻止連鎖變化。設(shè)計模式:設(shè)計模式: Abstract Factory,Bridge,Memento,Proxy設(shè)計模式怎樣解決設(shè)計問題(續(xù))設(shè)計模式怎樣解決

37、設(shè)計問題(續(xù))導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式算法依賴算法依賴 算法在開發(fā)和復(fù)用時常常被擴展、優(yōu)化和算法在開發(fā)和復(fù)用時常常被擴展、優(yōu)化和替代。依賴于某個特定算法的對象在算法發(fā)生變化時替代。依賴于某個特定算法的對象在算法發(fā)生變化時不得不變化。因此有可能發(fā)生變化的算法應(yīng)該被孤立不得不變化。因此有可能發(fā)生變化的算法應(yīng)該被孤立起來。起來。設(shè)計模式:設(shè)計模式: Builder,Iterator,Strategy,Template Method,Visitor設(shè)計模式怎樣解決設(shè)計問題(續(xù))設(shè)計模式怎樣解決設(shè)計問題(續(xù))導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)

38、計模式導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式緊耦合緊耦合 緊耦合的類很難獨立地被復(fù)用,因為它們是緊耦合的類很難獨立地被復(fù)用,因為它們是互相依賴的。緊耦合產(chǎn)生單塊的系統(tǒng),要改變或刪掉互相依賴的。緊耦合產(chǎn)生單塊的系統(tǒng),要改變或刪掉一個類,你必須理解和改變其他許多類。這樣的系統(tǒng)一個類,你必須理解和改變其他許多類。這樣的系統(tǒng)是一個很難學(xué)習(xí)、移植和維護(hù)的密集體。松散耦合提是一個很難學(xué)習(xí)、移植和維護(hù)的密集體。松散耦合提高了一個類本身被復(fù)用的可能性,并且系統(tǒng)更易于學(xué)高了一個類本身被復(fù)用的可能性,并且系統(tǒng)更易于學(xué)習(xí)、移植、修改和擴展。設(shè)計模式使用抽象耦合和分習(xí)、移植、修改和擴展。設(shè)計模式使用抽象耦合和分層

39、技術(shù)來提高系統(tǒng)的松散耦合性。層技術(shù)來提高系統(tǒng)的松散耦合性。設(shè)計模式:設(shè)計模式: Abstract Factory,Command,F(xiàn)acade,Mediator,Observer ,Chain of Responsibility。設(shè)計模式怎樣解決設(shè)計問題(續(xù))設(shè)計模式怎樣解決設(shè)計問題(續(xù))導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式通過生成子類來擴充功能通過生成子類來擴充功能 通常很難通過定義子類來通常很難通過定義子類來定制對象。每一個新類都有固定的實現(xiàn)開銷定制對象。每一個新類都有固定的實現(xiàn)開銷(初始化、初始化、終止處理等終止處理等)。定義子類還需要對父

40、類有深入的了解。定義子類還需要對父類有深入的了解。如,重定義一個操作可能需要重定義其他操作。一個如,重定義一個操作可能需要重定義其他操作。一個被重定義的操作可能需要調(diào)用繼承下來的操作。并且被重定義的操作可能需要調(diào)用繼承下來的操作。并且子類方法會導(dǎo)致類爆炸,因為即使對于一個簡單的擴子類方法會導(dǎo)致類爆炸,因為即使對于一個簡單的擴充,你也不得不引入許多新的子類。充,你也不得不引入許多新的子類。設(shè)計模式怎樣解決設(shè)計問題(續(xù))設(shè)計模式怎樣解決設(shè)計問題(續(xù))導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式一般的對象組合技術(shù)和具體的委托技術(shù),是繼承之外組合一般的對象組合技

41、術(shù)和具體的委托技術(shù),是繼承之外組合對象行為的另一種靈活方法。新的功能可以通過以新的方對象行為的另一種靈活方法。新的功能可以通過以新的方式組合已有對象,而不是通過定義已存在類的子類的方式式組合已有對象,而不是通過定義已存在類的子類的方式加到應(yīng)用中去。加到應(yīng)用中去。另一方面,過多使用對象組合會使設(shè)計難于理解。許多設(shè)另一方面,過多使用對象組合會使設(shè)計難于理解。許多設(shè)計模式產(chǎn)生的設(shè)計中,你可以定義一個子類,且將它的實計模式產(chǎn)生的設(shè)計中,你可以定義一個子類,且將它的實例和已存在實例進(jìn)行組合來引入定制的功能。例和已存在實例進(jìn)行組合來引入定制的功能。設(shè)計模式:設(shè)計模式:Bridge ,Chain of Re

42、sponsibility,Composite,Decorator,Observer,Strategy。設(shè)計模式怎樣解決設(shè)計問題(續(xù))設(shè)計模式怎樣解決設(shè)計問題(續(xù))導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式導(dǎo)致重新設(shè)計的原因,以及解決問題的設(shè)計模式不能方便地對類進(jìn)行修改不能方便地對類進(jìn)行修改 有時你不得不改變一個難有時你不得不改變一個難以修改的類。也許你需要源代碼而又沒有以修改的類。也許你需要源代碼而又沒有(對于商業(yè)對于商業(yè)類庫就有這種情況類庫就有這種情況),或者可能對類的任何改變會要,或者可能對類的任何改變會要求修改許多已存在的其他子類。設(shè)計模式提供在這些求修改許多已存在的其他子類。設(shè)計模式提

43、供在這些情況下對類進(jìn)行修改的方法。情況下對類進(jìn)行修改的方法。設(shè)計模式:設(shè)計模式: Adapter,Decorator,Visitor。6.11 設(shè)計模式的作用設(shè)計模式的作用1. 應(yīng)用程序應(yīng)用程序如果你將要建造像文檔編輯器或電子制表軟件這樣的如果你將要建造像文檔編輯器或電子制表軟件這樣的應(yīng)用程序應(yīng)用程序(Application Program),那么它的,那么它的內(nèi)部復(fù)內(nèi)部復(fù)用性、可維護(hù)性和可擴充性用性、可維護(hù)性和可擴充性是要優(yōu)先考慮的。是要優(yōu)先考慮的。內(nèi)部復(fù)用性確保你不會做多余的設(shè)計和實現(xiàn)。設(shè)計模內(nèi)部復(fù)用性確保你不會做多余的設(shè)計和實現(xiàn)。設(shè)計模式通過減少依賴性來提高內(nèi)部復(fù)用性。松散耦合也增式通過

44、減少依賴性來提高內(nèi)部復(fù)用性。松散耦合也增強了一類對象與其他多個對象協(xié)作的可能性。例如,強了一類對象與其他多個對象協(xié)作的可能性。例如,通過孤立和封裝每一個操作,以消除對特定操作的依通過孤立和封裝每一個操作,以消除對特定操作的依賴,可使在不同上下文中復(fù)用一個操作變得更簡單。賴,可使在不同上下文中復(fù)用一個操作變得更簡單。消除對算法和表示的依賴可達(dá)到同樣的效果。消除對算法和表示的依賴可達(dá)到同樣的效果。設(shè)計模式的作用設(shè)計模式的作用 (續(xù))(續(xù))1. 應(yīng)用程序應(yīng)用程序當(dāng)設(shè)計模式被用來對系統(tǒng)分層和限制對平臺的依賴性當(dāng)設(shè)計模式被用來對系統(tǒng)分層和限制對平臺的依賴性時,它們還會使一個應(yīng)用更具可維護(hù)性。通過顯示怎時

45、,它們還會使一個應(yīng)用更具可維護(hù)性。通過顯示怎樣擴展類層次結(jié)構(gòu)和怎樣使用對象復(fù)用,它們可增強樣擴展類層次結(jié)構(gòu)和怎樣使用對象復(fù)用,它們可增強系統(tǒng)的易擴充性。同時,耦合程度的降低也會增強可系統(tǒng)的易擴充性。同時,耦合程度的降低也會增強可擴充性。如果一個類不過多地依賴其他類,擴充這個擴充性。如果一個類不過多地依賴其他類,擴充這個孤立的類還是很容易的。孤立的類還是很容易的。設(shè)計模式的作用設(shè)計模式的作用 (續(xù))(續(xù))2. 工具箱工具箱一個應(yīng)用經(jīng)常會使用來自一個或多個被稱為工具箱一個應(yīng)用經(jīng)常會使用來自一個或多個被稱為工具箱( Toolkit )的預(yù)定義類庫中的類。工具箱是一組相關(guān)的預(yù)定義類庫中的類。工具箱是一

46、組相關(guān)的、可復(fù)用的類的集合,這些類提供了通用的功能。的、可復(fù)用的類的集合,這些類提供了通用的功能。工具箱的一個典型例子就是列表、關(guān)聯(lián)表單、堆棧等工具箱的一個典型例子就是列表、關(guān)聯(lián)表單、堆棧等類的集合,類的集合, C+的的I/O流庫是另一個例子。工具箱并流庫是另一個例子。工具箱并不強制應(yīng)用采用某個特定的設(shè)計,它們只是為你的應(yīng)不強制應(yīng)用采用某個特定的設(shè)計,它們只是為你的應(yīng)用提供功能上的幫助。工具箱強調(diào)的是代碼復(fù)用,它用提供功能上的幫助。工具箱強調(diào)的是代碼復(fù)用,它們是面向?qū)ο蟓h(huán)境下的們是面向?qū)ο蟓h(huán)境下的“子程序庫子程序庫”。設(shè)計模式的作用設(shè)計模式的作用 (續(xù))(續(xù))2. 工具箱工具箱工具箱的設(shè)計比應(yīng)

47、用設(shè)計要難得多,因為它要求對許工具箱的設(shè)計比應(yīng)用設(shè)計要難得多,因為它要求對許多應(yīng)用是可用的和有效的。再者,工具箱的設(shè)計者并多應(yīng)用是可用的和有效的。再者,工具箱的設(shè)計者并不知道什么應(yīng)用使用該工具箱及它們有什么特殊需求。不知道什么應(yīng)用使用該工具箱及它們有什么特殊需求。這樣,避免假設(shè)和依賴就變得很重要,否則會限制工這樣,避免假設(shè)和依賴就變得很重要,否則會限制工具箱的靈活性,進(jìn)而影響它的適用性和效率。具箱的靈活性,進(jìn)而影響它的適用性和效率。設(shè)計模式的作用設(shè)計模式的作用 (續(xù))(續(xù))3. 框架框架框架框架( Framework )是構(gòu)成一類特定軟件可復(fù)用設(shè)計是構(gòu)成一類特定軟件可復(fù)用設(shè)計的一組相互協(xié)作的類。例如,一個框架能幫助建立適的一組相互協(xié)作的類。例如,一個框架能幫助建立適合不同領(lǐng)域的圖形編輯器,像藝術(shù)繪畫、音樂作曲和合不同領(lǐng)域的圖形編輯器,像藝術(shù)繪畫、音樂作曲和機械機械CAD。另一個框架也許能幫助你建立針對不同。另一個框架也許能幫助你建立針對不同程序設(shè)計語言和目標(biāo)機器的編譯器。而再一個也許能程序設(shè)計語言和目標(biāo)機器的編譯器。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論