第8章設(shè)計(jì)模式1_第1頁(yè)
第8章設(shè)計(jì)模式1_第2頁(yè)
第8章設(shè)計(jì)模式1_第3頁(yè)
第8章設(shè)計(jì)模式1_第4頁(yè)
第8章設(shè)計(jì)模式1_第5頁(yè)
已閱讀5頁(yè),還剩65頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、7.1 模式的起源及軟件模式7.2 設(shè)計(jì)模式的概念、描述及分類7.3 設(shè)計(jì)模式與軟件體系結(jié)構(gòu)7.4 設(shè)計(jì)模式的原則和使用方式7.5 設(shè)計(jì)模式的重要性2模式之父模式之父 Christopher Alexander博士博士 美國(guó)加美國(guó)加利佛尼亞大學(xué)環(huán)境結(jié)構(gòu)中心研究所所長(zhǎng)利佛尼亞大學(xué)環(huán)境結(jié)構(gòu)中心研究所所長(zhǎng)A Pattern Language: Towns, Buildings, Construction,給出了,給出了253個(gè)建筑和城市規(guī)劃模式個(gè)建筑和城市規(guī)劃模式3Alexander 給出了關(guān)于模式的經(jīng)典定義:給出了關(guān)于模式的經(jīng)典定義: 每個(gè)模式都描述了一個(gè)每個(gè)模式都描述了一個(gè)在我們環(huán)境中不斷出現(xiàn)的

2、問(wèn)題在我們環(huán)境中不斷出現(xiàn)的問(wèn)題,然后描述了該問(wèn)題的然后描述了該問(wèn)題的解決方案解決方案的核心,通過(guò)這種方式,的核心,通過(guò)這種方式,我們可以無(wú)數(shù)次地我們可以無(wú)數(shù)次地重用那些已有的解決方案重用那些已有的解決方案,無(wú)需再重,無(wú)需再重復(fù)相同的工作復(fù)相同的工作A pattern is a solution to a problem in a context 模式是在特定環(huán)境中(前提條件下)解決目標(biāo)問(wèn)題的一模式是在特定環(huán)境中(前提條件下)解決目標(biāo)問(wèn)題的一種可重用(已確認(rèn))方案種可重用(已確認(rèn))方案 解決一個(gè)問(wèn)題解決一個(gè)問(wèn)題:從模式可以得到解,而不僅僅是抽象的:從模式可以得到解,而不僅僅是抽象的原則或策略原則

3、或策略是一個(gè)被證明了的概念是一個(gè)被證明了的概念:模式通過(guò):模式通過(guò)個(gè)記錄得到解,而個(gè)記錄得到解,而不是通過(guò)理論或推測(cè)不是通過(guò)理論或推測(cè)解并不是顯然的解并不是顯然的:對(duì)大多數(shù)比較困難的設(shè)計(jì)問(wèn)題來(lái)說(shuō),:對(duì)大多數(shù)比較困難的設(shè)計(jì)問(wèn)題來(lái)說(shuō),以非直接的方式得到解是必要的以非直接的方式得到解是必要的41990年,軟件工程界開(kāi)始關(guān)注年,軟件工程界開(kāi)始關(guān)注 Alexander 博士在建博士在建筑與城市規(guī)劃領(lǐng)域研究的重大突破。最早將這種筑與城市規(guī)劃領(lǐng)域研究的重大突破。最早將這種“模式模式”的思想引入軟件工程方法學(xué)的以的思想引入軟件工程方法學(xué)的以“四人組四人組(Gang of Four,GoF)自稱的四位著名軟件工

4、程學(xué)者,他們?cè)谧苑Q的四位著名軟件工程學(xué)者,他們?cè)?994年歸納發(fā)表了年歸納發(fā)表了23種在軟件開(kāi)發(fā)中使用頻率較高的種在軟件開(kāi)發(fā)中使用頻率較高的設(shè)計(jì)模式,旨在用模式來(lái)統(tǒng)一溝通面向?qū)ο蠓椒ㄔ诜治鲈O(shè)計(jì)模式,旨在用模式來(lái)統(tǒng)一溝通面向?qū)ο蠓椒ㄔ诜治?、設(shè)計(jì)和實(shí)現(xiàn)間的鴻溝、設(shè)計(jì)和實(shí)現(xiàn)間的鴻溝56Erich Gamma:蘇黎世蘇黎世大學(xué)計(jì)算機(jī)科學(xué)博士,是大學(xué)計(jì)算機(jī)科學(xué)博士,是Eclipse、 JUnit 等項(xiàng)目主等項(xiàng)目主要技術(shù)負(fù)責(zé)人之一要技術(shù)負(fù)責(zé)人之一John Vlissides:斯坦福:斯坦福大學(xué)計(jì)算機(jī)科學(xué)博士,大學(xué)計(jì)算機(jī)科學(xué)博士,原原IBM研究員研究員Ralph Johnson:康奈:康奈爾大學(xué)計(jì)算機(jī)科學(xué)博

5、士,爾大學(xué)計(jì)算機(jī)科學(xué)博士,伊利諾伊大學(xué)教授伊利諾伊大學(xué)教授Richard Helm:墨爾本:墨爾本大學(xué)計(jì)算機(jī)科學(xué)博士,原大學(xué)計(jì)算機(jī)科學(xué)博士,原IBM 研究員,現(xiàn)在研究員,現(xiàn)在IBM咨咨詢集團(tuán)供職詢集團(tuán)供職軟件模式是將模式的一般概念應(yīng)用于軟件開(kāi)發(fā)領(lǐng)域,即軟件模式是將模式的一般概念應(yīng)用于軟件開(kāi)發(fā)領(lǐng)域,即軟件開(kāi)發(fā)的總體指導(dǎo)思路或參照樣板軟件開(kāi)發(fā)的總體指導(dǎo)思路或參照樣板軟件模式并非僅限于設(shè)計(jì)模式,還包括架構(gòu)模式、分析軟件模式并非僅限于設(shè)計(jì)模式,還包括架構(gòu)模式、分析模式和過(guò)程模式等,實(shí)際上,模式和過(guò)程模式等,實(shí)際上,在軟件生存期的每一個(gè)階在軟件生存期的每一個(gè)階段都存在著一些被認(rèn)同的模式段都存在著一些被認(rèn)

6、同的模式模式的核心思想是通過(guò)增加抽象層,把變化部分從那些模式的核心思想是通過(guò)增加抽象層,把變化部分從那些不變部分里分離出來(lái)不變部分里分離出來(lái)7對(duì)通用設(shè)計(jì)問(wèn)題的重復(fù)解決方案對(duì)通用設(shè)計(jì)問(wèn)題的重復(fù)解決方案對(duì)真實(shí)世界問(wèn)題的實(shí)踐的對(duì)真實(shí)世界問(wèn)題的實(shí)踐的/具體的解決方案具體的解決方案面向特定的問(wèn)題環(huán)境面向特定的問(wèn)題環(huán)境權(quán)衡利弊之后得到的權(quán)衡利弊之后得到的“最佳最佳”解決方案解決方案領(lǐng)域?qū)<液驮O(shè)計(jì)老手的領(lǐng)域?qū)<液驮O(shè)計(jì)老手的“殺手锏殺手锏”用文檔的方式記錄的最佳實(shí)踐用文檔的方式記錄的最佳實(shí)踐在討論問(wèn)題的解決方案時(shí),一種可交流的詞匯在討論問(wèn)題的解決方案時(shí),一種可交流的詞匯在使用(重用)、共享、構(gòu)造軟件系統(tǒng)中,一

7、種有效地在使用(重用)、共享、構(gòu)造軟件系統(tǒng)中,一種有效地使用已有的智慧使用已有的智慧/經(jīng)驗(yàn)經(jīng)驗(yàn)/專家技術(shù)的方式專家技術(shù)的方式8僅僅限于面向?qū)ο蟮能浖O(shè)計(jì)僅僅限于面向?qū)ο蟮能浖O(shè)計(jì)未經(jīng)檢驗(yàn)的想法未經(jīng)檢驗(yàn)的想法/理論或新的發(fā)現(xiàn)理論或新的發(fā)現(xiàn)僅僅使用過(guò)一次的解決方案(只有經(jīng)過(guò)三個(gè)以上不同類僅僅使用過(guò)一次的解決方案(只有經(jīng)過(guò)三個(gè)以上不同類型或不同領(lǐng)域的系統(tǒng)的校驗(yàn),一個(gè)解決方案才能從候選型或不同領(lǐng)域的系統(tǒng)的校驗(yàn),一個(gè)解決方案才能從候選模式升格為模式)模式升格為模式)以模式的形式描述過(guò)時(shí)的技術(shù)和方法以模式的形式描述過(guò)時(shí)的技術(shù)和方法抽象原理或啟發(fā)性的構(gòu)想抽象原理或啟發(fā)性的構(gòu)想在任何環(huán)境下都適用的通用解決方案

8、在任何環(huán)境下都適用的通用解決方案“萬(wàn)精油萬(wàn)精油”或或“萬(wàn)能藥萬(wàn)能藥”910經(jīng)典教材經(jīng)典教材英文版英文版經(jīng)典教材經(jīng)典教材中文版中文版參考教材參考教材劉偉著劉偉著參考教材參考教材入門級(jí)入門級(jí)11典型表現(xiàn)典型表現(xiàn) 過(guò)于僵化過(guò)于僵化(Rigidity):軟件難以增加新功能,哪怕是簡(jiǎn)單的功):軟件難以增加新功能,哪怕是簡(jiǎn)單的功能,存在大量的硬編碼,使代碼的靈活性非常差能,存在大量的硬編碼,使代碼的靈活性非常差 過(guò)于脆弱過(guò)于脆弱(Fragility):軟件的一處修改往往導(dǎo)致看上去沒(méi)有關(guān)):軟件的一處修改往往導(dǎo)致看上去沒(méi)有關(guān)系的另一個(gè)地方出現(xiàn)故障系的另一個(gè)地方出現(xiàn)故障 復(fù)用率低復(fù)用率低(Immobility

9、):無(wú)法重用項(xiàng)目中其他部分的功能,):無(wú)法重用項(xiàng)目中其他部分的功能,只能簡(jiǎn)單的粘貼代碼來(lái)代替重用只能簡(jiǎn)單的粘貼代碼來(lái)代替重用 粘度過(guò)高粘度過(guò)高(Viscosity):破壞系統(tǒng)原來(lái)框架和意圖的改動(dòng)方式):破壞系統(tǒng)原來(lái)框架和意圖的改動(dòng)方式比保留這些內(nèi)容更加容易,是一種錯(cuò)誤的代碼維護(hù)方案比保留這些內(nèi)容更加容易,是一種錯(cuò)誤的代碼維護(hù)方案 不透明性不透明性(Opacity):一個(gè)模塊難以理解):一個(gè)模塊難以理解121、選擇太多,無(wú)從下手、選擇太多,無(wú)從下手publicprotectedprivate繼承繼承組合組合實(shí)現(xiàn)繼承實(shí)現(xiàn)繼承接口繼承接口繼承成員變量成員變量局部變量局部變量2、沒(méi)有正確答案:、沒(méi)有正

10、確答案: 不知道我們是否真正的實(shí)現(xiàn)了面向?qū)ο蟮囊?,看別人不知道我們是否真正的實(shí)現(xiàn)了面向?qū)ο蟮囊螅磩e人寫的東西都是垃圾,自己寫的東西慢慢也成為了垃圾寫的東西都是垃圾,自己寫的東西慢慢也成為了垃圾問(wèn)題總結(jié)為:?jiǎn)栴}總結(jié)為:怎樣才能實(shí)現(xiàn)好的設(shè)計(jì),什么才是好的設(shè)怎樣才能實(shí)現(xiàn)好的設(shè)計(jì),什么才是好的設(shè)計(jì)計(jì) 高可復(fù)用性,高靈活性,高擴(kuò)展性高可復(fù)用性,高靈活性,高擴(kuò)展性 高內(nèi)聚,低高內(nèi)聚,低耦合耦合13“選擇太多,無(wú)從下手選擇太多,無(wú)從下手”的解答:一下子得到復(fù)用性和靈的解答:一下子得到復(fù)用性和靈活性好的設(shè)計(jì),不可能或非常困難;所以,內(nèi)行的設(shè)計(jì)活性好的設(shè)計(jì),不可能或非常困難;所以,內(nèi)行的設(shè)計(jì)者通常會(huì)復(fù)用以

11、前使用過(guò)的可行的軟件設(shè)計(jì)解決方案者通常會(huì)復(fù)用以前使用過(guò)的可行的軟件設(shè)計(jì)解決方案“沒(méi)有正確答案沒(méi)有正確答案”的解答:已經(jīng)驗(yàn)證過(guò)、被多次使用的、的解答:已經(jīng)驗(yàn)證過(guò)、被多次使用的、面向?qū)ο蟮脑O(shè)計(jì)就是很好的設(shè)計(jì)面向?qū)ο蟮脑O(shè)計(jì)就是很好的設(shè)計(jì)設(shè)計(jì)模式的目的就是將面向?qū)ο筌浖脑O(shè)計(jì)經(jīng)驗(yàn)記錄下設(shè)計(jì)模式的目的就是將面向?qū)ο筌浖脑O(shè)計(jì)經(jīng)驗(yàn)記錄下來(lái),可以作為面向?qū)ο筌浖O(shè)計(jì)的來(lái),可以作為面向?qū)ο筌浖O(shè)計(jì)的“武林秘籍武林秘籍”,我們掌,我們掌握了設(shè)計(jì)模式,加上不斷的靈活應(yīng)用,就可以說(shuō)是握了設(shè)計(jì)模式,加上不斷的靈活應(yīng)用,就可以說(shuō)是OO行行家,就可以站在巨人的肩膀上作出好的設(shè)計(jì)家,就可以站在巨人的肩膀上作出好的設(shè)計(jì)14設(shè)

12、計(jì)模式(設(shè)計(jì)模式(Design Pattern)是隨著面向?qū)ο蠹夹g(shù)的)是隨著面向?qū)ο蠹夹g(shù)的出現(xiàn)和廣泛使用而提出的出現(xiàn)和廣泛使用而提出的在一個(gè)設(shè)計(jì)完成之前,有經(jīng)驗(yàn)的面向?qū)ο笤O(shè)計(jì)師往往要在一個(gè)設(shè)計(jì)完成之前,有經(jīng)驗(yàn)的面向?qū)ο笤O(shè)計(jì)師往往要重復(fù)使用若干次,而且每次都要進(jìn)行改進(jìn)。當(dāng)然,不能重復(fù)使用若干次,而且每次都要進(jìn)行改進(jìn)。當(dāng)然,不能只用最初的方法解決每個(gè)問(wèn)題,常常重復(fù)使用那些過(guò)去只用最初的方法解決每個(gè)問(wèn)題,常常重復(fù)使用那些過(guò)去用過(guò)的解決方案。而這些經(jīng)驗(yàn)也正是他們成為專家的法用過(guò)的解決方案。而這些經(jīng)驗(yàn)也正是他們成為專家的法寶,這就是設(shè)計(jì)經(jīng)驗(yàn)的價(jià)值寶,這就是設(shè)計(jì)經(jīng)驗(yàn)的價(jià)值將設(shè)計(jì)面向?qū)ο筌浖慕?jīng)驗(yàn)記錄成將設(shè)

13、計(jì)面向?qū)ο筌浖慕?jīng)驗(yàn)記錄成“設(shè)計(jì)模式設(shè)計(jì)模式”,可以方,可以方便地重用成功的設(shè)計(jì)和結(jié)構(gòu),將已證實(shí)的技術(shù)表述成設(shè)便地重用成功的設(shè)計(jì)和結(jié)構(gòu),將已證實(shí)的技術(shù)表述成設(shè)計(jì)模式也會(huì)使新系統(tǒng)開(kāi)發(fā)者更加容易理解其設(shè)計(jì)思路計(jì)模式也會(huì)使新系統(tǒng)開(kāi)發(fā)者更加容易理解其設(shè)計(jì)思路151987年年,Kent Beck 和和 Ward Cunningham 借鑒借鑒 Alexander 的模的模式思想在程序開(kāi)發(fā)中開(kāi)始應(yīng)用一些模式式思想在程序開(kāi)發(fā)中開(kāi)始應(yīng)用一些模式 ,在,在OOPSLA會(huì)議上發(fā)表了他們的會(huì)議上發(fā)表了他們的成果;成果;1990年年,OOPSLA與與ECOOP聯(lián)合舉辦,聯(lián)合舉辦,Erich Gamma 和和 Rich

14、ard Helm 等人開(kāi)始討論有關(guān)模式的話題等人開(kāi)始討論有關(guān)模式的話題 (Bruce Anderson主持主持),“四人組四人組” 正式成立,并開(kāi)始著手進(jìn)行設(shè)計(jì)模式的分類整理工作;正式成立,并開(kāi)始著手進(jìn)行設(shè)計(jì)模式的分類整理工作; 1991年年,OOPSLA會(huì)議上會(huì)議上 Bruce Anderson 主持了首次針對(duì)設(shè)計(jì)模式主持了首次針對(duì)設(shè)計(jì)模式的研討會(huì),模式逐漸成為人們討論的話題;的研討會(huì),模式逐漸成為人們討論的話題;1994 年年,由著名的,由著名的 Hillside Group 發(fā)起,在美國(guó)召開(kāi)了第發(fā)起,在美國(guó)召開(kāi)了第1屆關(guān)于面屆關(guān)于面向?qū)ο竽J降氖澜缧詴?huì)議,名為向?qū)ο竽J降氖澜缧詴?huì)議,名為

15、 PLoP (Pattern Languages of Programs, 編程語(yǔ)言模式會(huì)議編程語(yǔ)言模式會(huì)議);1995年年, 四人組出版了四人組出版了設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)一書(shū),一書(shū),成為當(dāng)年最搶手的面向?qū)ο髸?shū)籍,也成為設(shè)計(jì)模式的經(jīng)典書(shū)籍。成為當(dāng)年最搶手的面向?qū)ο髸?shū)籍,也成為設(shè)計(jì)模式的經(jīng)典書(shū)籍。16定義定義1:是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼:是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié),使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易設(shè)計(jì)經(jīng)驗(yàn)的總結(jié),使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代

16、碼可靠性被他人理解、保證代碼可靠性定義定義2:是從許多優(yōu)秀的軟件系統(tǒng)中總結(jié)出的成功的可復(fù)用的設(shè)計(jì)方:是從許多優(yōu)秀的軟件系統(tǒng)中總結(jié)出的成功的可復(fù)用的設(shè)計(jì)方案,可以幫助設(shè)計(jì)者更快更好地完成系統(tǒng)設(shè)計(jì)案,可以幫助設(shè)計(jì)者更快更好地完成系統(tǒng)設(shè)計(jì)定義定義3:是一些設(shè)計(jì)面向?qū)ο蟮能浖_(kāi)發(fā)的經(jīng)驗(yàn)總結(jié),一個(gè)設(shè)計(jì)模式是一些設(shè)計(jì)面向?qū)ο蟮能浖_(kāi)發(fā)的經(jīng)驗(yàn)總結(jié),一個(gè)設(shè)計(jì)模式事實(shí)上是系統(tǒng)地命名、解釋和評(píng)價(jià)某一個(gè)重要的、可重現(xiàn)的面向?qū)κ聦?shí)上是系統(tǒng)地命名、解釋和評(píng)價(jià)某一個(gè)重要的、可重現(xiàn)的面向?qū)ο蟮脑O(shè)計(jì)方案象的設(shè)計(jì)方案定義定義4:是對(duì)被用來(lái)在特定場(chǎng)景下解決一般設(shè)計(jì)問(wèn)題的類和相互通信:是對(duì)被用來(lái)在特定場(chǎng)景下解決一般設(shè)計(jì)問(wèn)題的類和相

17、互通信的對(duì)象的描述,是在類和對(duì)象的層次描述的可重復(fù)使用的軟件設(shè)計(jì)的對(duì)象的描述,是在類和對(duì)象的層次描述的可重復(fù)使用的軟件設(shè)計(jì)問(wèn)題的解決方案問(wèn)題的解決方案17設(shè)計(jì)模式是特定場(chǎng)景的通用設(shè)計(jì)解決方案設(shè)計(jì)模式是特定場(chǎng)景的通用設(shè)計(jì)解決方案 通用通用 被反復(fù)使用,或者已被成功實(shí)踐證實(shí)過(guò)的被反復(fù)使用,或者已被成功實(shí)踐證實(shí)過(guò)的 可以復(fù)用,提高質(zhì)量與效率可以復(fù)用,提高質(zhì)量與效率 特定場(chǎng)景特定場(chǎng)景 設(shè)計(jì)模式是無(wú)窮無(wú)盡的,不同場(chǎng)景或者同一場(chǎng)景不同動(dòng)機(jī)都會(huì)產(chǎn)設(shè)計(jì)模式是無(wú)窮無(wú)盡的,不同場(chǎng)景或者同一場(chǎng)景不同動(dòng)機(jī)都會(huì)產(chǎn)生不同的設(shè)計(jì)模式生不同的設(shè)計(jì)模式 可復(fù)用但勿套用,必須理解設(shè)計(jì)模式的使用場(chǎng)景與目標(biāo)可復(fù)用但勿套用,必須理解設(shè)

18、計(jì)模式的使用場(chǎng)景與目標(biāo)181920考慮一個(gè)軟件應(yīng)用場(chǎng)景,一個(gè)軟件系統(tǒng)可以提供多個(gè)外考慮一個(gè)軟件應(yīng)用場(chǎng)景,一個(gè)軟件系統(tǒng)可以提供多個(gè)外觀不同的按鈕(如圓形按鈕、矩形按鈕、菱形按鈕等)觀不同的按鈕(如圓形按鈕、矩形按鈕、菱形按鈕等),這些按鈕都源自同一個(gè)基類,不過(guò)在繼承基類后不同,這些按鈕都源自同一個(gè)基類,不過(guò)在繼承基類后不同的子類修改了部分屬性從而使得它們可以呈現(xiàn)不同的外的子類修改了部分屬性從而使得它們可以呈現(xiàn)不同的外觀,怎么創(chuàng)建不同按鈕的對(duì)象更方便呢?觀,怎么創(chuàng)建不同按鈕的對(duì)象更方便呢?21創(chuàng)建這些按鈕時(shí),不需要知道這些具體按鈕類的名字,創(chuàng)建這些按鈕時(shí),不需要知道這些具體按鈕類的名字,只需要知道

19、表示該按鈕類的一個(gè)參數(shù),并提供一個(gè)調(diào)用只需要知道表示該按鈕類的一個(gè)參數(shù),并提供一個(gè)調(diào)用方便的方法,把該參數(shù)傳入方法即可返回一個(gè)相應(yīng)的按方便的方法,把該參數(shù)傳入方法即可返回一個(gè)相應(yīng)的按鈕對(duì)象鈕對(duì)象22系統(tǒng)根據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中的用戶權(quán)限等級(jí)(以整數(shù)形式系統(tǒng)根據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中的用戶權(quán)限等級(jí)(以整數(shù)形式存儲(chǔ)),創(chuàng)建不同等級(jí)的用戶對(duì)象,并實(shí)現(xiàn)不同權(quán)限的存儲(chǔ)),創(chuàng)建不同等級(jí)的用戶對(duì)象,并實(shí)現(xiàn)不同權(quán)限的操作操作Administrator+ diffOperation ().: voidUserFactory+ getUser (int permission).: UserEmployee+ diffOpera

20、tion ().: voidManager+ diffOperation ().: voidUser+sameOperation ()diffOperation ().: void: void23public abstract class User public void sameOperation() System.out.println(修改個(gè)人資料!修改個(gè)人資料!); public abstract void diffOperation();public class Manager extends User public Employee() System.out.println(“創(chuàng)建

21、經(jīng)理對(duì)象!創(chuàng)建經(jīng)理對(duì)象!); public void diffOperation() System.out.println(“經(jīng)理?yè)碛袆?chuàng)建和審批假條權(quán)限!經(jīng)理?yè)碛袆?chuàng)建和審批假條權(quán)限!); 24public class UserFactory public static User getUser(int permission) if(0=permission) return new Employee(); else if(1=permission) return new Manager(); else return null;25public class Client public static

22、 void main(String args) User user; int permission = findPermission(zh,123); user=UserFactory.getUser(permission); user.sameOperation(); user.diffOperation(); 26適用場(chǎng)景適用場(chǎng)景:負(fù)責(zé)創(chuàng)建的對(duì)象比較少,不會(huì)造成工廠方法:負(fù)責(zé)創(chuàng)建的對(duì)象比較少,不會(huì)造成工廠方法中的業(yè)務(wù)邏輯太過(guò)復(fù)雜;客戶端只知道傳入工廠類的參中的業(yè)務(wù)邏輯太過(guò)復(fù)雜;客戶端只知道傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象不關(guān)心數(shù),對(duì)于如何創(chuàng)建對(duì)象不關(guān)心優(yōu)點(diǎn)優(yōu)點(diǎn):將對(duì)象的創(chuàng)建和對(duì)象本身業(yè)務(wù)

23、處理分離,降低系:將對(duì)象的創(chuàng)建和對(duì)象本身業(yè)務(wù)處理分離,降低系統(tǒng)的耦合度;通常實(shí)現(xiàn)為類靜態(tài)方法,通過(guò)類名直接調(diào)統(tǒng)的耦合度;通常實(shí)現(xiàn)為類靜態(tài)方法,通過(guò)類名直接調(diào)用,非常方便,而且只需要傳入一個(gè)簡(jiǎn)單的參數(shù)即可用,非常方便,而且只需要傳入一個(gè)簡(jiǎn)單的參數(shù)即可缺點(diǎn)缺點(diǎn):簡(jiǎn)單工廠類集中了所有產(chǎn)品的創(chuàng)建邏輯,一旦不:簡(jiǎn)單工廠類集中了所有產(chǎn)品的創(chuàng)建邏輯,一旦不能正常工作,整個(gè)系統(tǒng)都要受到影響;增加了類的個(gè)數(shù)能正常工作,整個(gè)系統(tǒng)都要受到影響;增加了類的個(gè)數(shù),且一旦添加新對(duì)象就得修改創(chuàng)建邏輯,對(duì)象較多時(shí)可,且一旦添加新對(duì)象就得修改創(chuàng)建邏輯,對(duì)象較多時(shí)可能造成創(chuàng)建邏輯過(guò)于復(fù)雜,不利于系統(tǒng)的擴(kuò)展和維護(hù)能造成創(chuàng)建邏輯過(guò)于

24、復(fù)雜,不利于系統(tǒng)的擴(kuò)展和維護(hù)27模式名稱(模式名稱(pattern name) 它用一兩個(gè)詞來(lái)構(gòu)成助記名它用一兩個(gè)詞來(lái)構(gòu)成助記名模式的目的模式的目的/問(wèn)題問(wèn)題(problem) 描述了應(yīng)該在何時(shí)使用模式,解釋了設(shè)計(jì)問(wèn)題和問(wèn)題存在的前因描述了應(yīng)該在何時(shí)使用模式,解釋了設(shè)計(jì)問(wèn)題和問(wèn)題存在的前因后果,以及使用模式必須滿足的一系列先決條件后果,以及使用模式必須滿足的一系列先決條件解決方案解決方案(solution) 描述了設(shè)計(jì)的組成成分,它們之間的相互關(guān)系及各自的職責(zé)和協(xié)描述了設(shè)計(jì)的組成成分,它們之間的相互關(guān)系及各自的職責(zé)和協(xié)作方式,因?yàn)槟J娇蓱?yīng)用于多種不同場(chǎng)合,所以解決方案并不描作方式,因?yàn)槟J娇蓱?yīng)

25、用于多種不同場(chǎng)合,所以解決方案并不描述一個(gè)特定而具體的設(shè)計(jì)或?qū)崿F(xiàn),而是提供設(shè)計(jì)問(wèn)題的抽象描述述一個(gè)特定而具體的設(shè)計(jì)或?qū)崿F(xiàn),而是提供設(shè)計(jì)問(wèn)題的抽象描述和怎樣用一個(gè)具有一般意義的元素組合來(lái)解決這個(gè)問(wèn)題和怎樣用一個(gè)具有一般意義的元素組合來(lái)解決這個(gè)問(wèn)題效果效果(consequences) 描述了應(yīng)用效果及使用模式應(yīng)權(quán)衡的問(wèn)題(限制和約束因素)描述了應(yīng)用效果及使用模式應(yīng)權(quán)衡的問(wèn)題(限制和約束因素)2829設(shè)計(jì)模式模式名和分類結(jié)構(gòu)實(shí)現(xiàn)別名意圖動(dòng)機(jī)適用性協(xié)作參與者效果代碼示例已知應(yīng)用相關(guān)模式30u模式名和分類:模式名簡(jiǎn)潔地描述了設(shè)計(jì)模式的本質(zhì)u別名:模式的其他名稱u意圖:設(shè)計(jì)模式是做什么的?它的基本原理和意

26、圖是什么?它解決的是什么樣的特定設(shè)計(jì)問(wèn)題?u動(dòng)機(jī):說(shuō)明一個(gè)設(shè)計(jì)問(wèn)題以及如何用模式中的類、對(duì)象來(lái)解決該問(wèn)題的特定情景u適用性:什么情況下可以使用該設(shè)計(jì)模式?該模式可用來(lái)改進(jìn)哪些不良設(shè)計(jì)?如何識(shí)別這些情況?u結(jié)構(gòu):采用對(duì)象建模技術(shù)對(duì)模式中的類進(jìn)行圖形描述u參與者:指設(shè)計(jì)模式中的類及對(duì)象以及它們各自的職責(zé)31u協(xié)作:模式的參與者如何協(xié)作以實(shí)現(xiàn)其職責(zé)u實(shí)現(xiàn):實(shí)現(xiàn)模式時(shí)需了解的一些提示、技術(shù)要點(diǎn)及應(yīng)避免的缺陷,以及是否存在某些特定于實(shí)現(xiàn)語(yǔ)言的問(wèn)題u代碼示例:用來(lái)說(shuō)明怎樣實(shí)現(xiàn)該模式的代碼片段u效果:模式如何支持其目標(biāo)?使用模式的效果和所需做的權(quán)衡取舍?系統(tǒng)結(jié)構(gòu)的哪些方面可以獨(dú)立改變?u已知應(yīng)用:實(shí)際系統(tǒng)中

27、發(fā)現(xiàn)的模式的例子,每個(gè)模式至少包括兩個(gè)不同領(lǐng)域的實(shí)例u相關(guān)模式:與這個(gè)模式緊密相關(guān)的模式有哪些?其不同之處是什么?這個(gè)模式應(yīng)與哪些其他模式一起使用?32根據(jù)模式的目的根據(jù)模式的目的(即用來(lái)做什么)可分為:(即用來(lái)做什么)可分為: 創(chuàng)建型模式創(chuàng)建型模式(Creational):主要用于創(chuàng)建對(duì)象:主要用于創(chuàng)建對(duì)象 結(jié)構(gòu)型模式結(jié)構(gòu)型模式(Structural):主要用于處理類或?qū)ο蟮慕M合:主要用于處理類或?qū)ο蟮慕M合 行為型模式行為型模式(Behavioral):主要用于描述類或?qū)ο笤鯓咏换ィ褐饕糜诿枋鲱惢驅(qū)ο笤鯓咏换?和怎樣分配職責(zé)和怎樣分配職責(zé)根據(jù)模式用于處理類之間還是對(duì)象之間的關(guān)系,根據(jù)模式用

28、于處理類之間還是對(duì)象之間的關(guān)系,可分為可分為:類模式類模式:處理類和子類之間的關(guān)系,這些關(guān)系通過(guò)繼承建立,在編:處理類和子類之間的關(guān)系,這些關(guān)系通過(guò)繼承建立,在編 譯時(shí)刻就被確定下來(lái),是屬于靜態(tài)的譯時(shí)刻就被確定下來(lái),是屬于靜態(tài)的對(duì)象模式對(duì)象模式:處理對(duì)象間的關(guān)系,在運(yùn)行時(shí)變化,更具有動(dòng)態(tài)性:處理對(duì)象間的關(guān)系,在運(yùn)行時(shí)變化,更具有動(dòng)態(tài)性33從某種意義上說(shuō),幾乎所有模式都使用繼承機(jī)制,所以從某種意義上說(shuō),幾乎所有模式都使用繼承機(jī)制,所以類模式只指那些集中于處理類間關(guān)系的模式,而大部分類模式只指那些集中于處理類間關(guān)系的模式,而大部分模式都屬于對(duì)象模式的范疇模式都屬于對(duì)象模式的范疇創(chuàng)建型類模式創(chuàng)建型類

29、模式 將對(duì)象的部分創(chuàng)建工作延遲到子類將對(duì)象的部分創(chuàng)建工作延遲到子類創(chuàng)建型對(duì)象模式創(chuàng)建型對(duì)象模式 則將它延遲到另一個(gè)對(duì)象中則將它延遲到另一個(gè)對(duì)象中結(jié)構(gòu)型類模式結(jié)構(gòu)型類模式 使用繼承機(jī)制來(lái)組合類使用繼承機(jī)制來(lái)組合類結(jié)構(gòu)型對(duì)象模式結(jié)構(gòu)型對(duì)象模式 則描述了對(duì)象的組裝方式則描述了對(duì)象的組裝方式行為型類模式行為型類模式 使用繼承描述算法和控制流使用繼承描述算法和控制流行為型對(duì)象模式行為型對(duì)象模式 則描述一組對(duì)象怎樣協(xié)作完成單個(gè)對(duì)象所無(wú)法則描述一組對(duì)象怎樣協(xié)作完成單個(gè)對(duì)象所無(wú)法 完成的任務(wù)完成的任務(wù)3435目的創(chuàng)建型結(jié)構(gòu)型行為型范圍類Factory MethodFactory MethodAdapter(A

30、dapter(類類) )InterpreterInterpreterTemplate MethodTemplate Method對(duì)象Abstract FactoryAbstract FactoryBuilderBuilderPrototypePrototypeSingletonSingletonAdapter(Adapter(對(duì)象對(duì)象) )BridgeBridgeCompositeCompositeDecoratorDecoratorFacadeFacadeFlyweightFlyweightProxyProxyChain of ResponsibilityChain of Responsib

31、ilityCommandCommandIteratorIteratorMediatorMediatorMementoMementoObserverObserverStateStateStrategyStrategyVisitorVisitor36u工廠方法(Factory Method):父類負(fù)責(zé)定義創(chuàng)建對(duì)象的公共接口,而子類則負(fù)責(zé)生成具體對(duì)象,將類的實(shí)例化操作延遲到子類中完成u抽象工廠(Abstract Factory):為一個(gè)產(chǎn)品族提供統(tǒng)一的創(chuàng)建接口。當(dāng)需要這個(gè)產(chǎn)品族的某一系列的時(shí)候,可以從抽象工廠中選出相應(yīng)的系列創(chuàng)建一個(gè)具體的工廠類u單件(Singleton):保證一個(gè)類有且僅有一個(gè)實(shí)例

32、,提供一個(gè)全局訪問(wèn)點(diǎn)u生成器(Builder):將復(fù)雜對(duì)象創(chuàng)建與表示分離,同樣的創(chuàng)建過(guò)程可創(chuàng)建不同的表示。允許用戶通過(guò)指定復(fù)雜對(duì)象類型和內(nèi)容來(lái)創(chuàng)建對(duì)象,用戶不需要知道對(duì)象內(nèi)部的具體構(gòu)建細(xì)節(jié)37u組合(Composite):定義一個(gè)接口,使之用于單一對(duì)象,也可以應(yīng)用于多個(gè)單一對(duì)象組成的對(duì)象組u裝飾(Decorator):給對(duì)象動(dòng)態(tài)添加額外的職責(zé),就好像給一個(gè)物體加上裝飾物,完善其功能u代理(Proxy):在軟件系統(tǒng)中,有些對(duì)象有時(shí)候由于跨越網(wǎng)絡(luò)或者其他障礙,而不能夠或者不想直接訪問(wèn)另一個(gè)對(duì)象,直接訪問(wèn)會(huì)給系統(tǒng)帶來(lái)不必要的復(fù)雜性,這時(shí)候可以在客戶程序和目標(biāo)對(duì)象之間增加一層中間層,讓代理對(duì)象來(lái)代替目

33、標(biāo)對(duì)象打點(diǎn)一切u外觀(Facade):為子系統(tǒng)提供了一個(gè)更高層次、更簡(jiǎn)單的接口,從而降低了子系統(tǒng)的復(fù)雜度,使子系統(tǒng)更易于使用和管理。外觀承擔(dān)了子系統(tǒng)中類交互的責(zé)任u橋梁(Bridge):橋梁模式的用意是將問(wèn)題的抽象和實(shí)現(xiàn)分離開(kāi)來(lái)實(shí)現(xiàn),通過(guò)用聚合代替繼承來(lái)解決子類爆炸性增長(zhǎng)的問(wèn)題38u觀察者(Observer):定義了對(duì)象之間一對(duì)多的依賴,當(dāng)這個(gè)對(duì)象的狀態(tài)發(fā)生改變的時(shí)候,多個(gè)對(duì)象會(huì)接受到通知,有機(jī)會(huì)做出反饋u命令(Command):將請(qǐng)求及其參數(shù)封裝成一個(gè)對(duì)象,作為命令發(fā)起者和接收者的中介,可以對(duì)這些請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤銷操作u策略(Strategy):定義一組算法,將每個(gè)算法都

34、封裝起來(lái),并且使它們之間可以互換。策略模式使這些算法在客戶端調(diào)用它們的時(shí)候能夠互不影響地變化u模版(Template ) :定義了一個(gè)算法步驟,并允許子類為一個(gè)或多個(gè)步驟提供實(shí)現(xiàn)。子類在不改變算法架構(gòu)的情況下,可重新定義算法中某些步驟u迭代子(Iterator):提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素, 而又不需暴露該對(duì)象的內(nèi)部表示39框架不等同于體系結(jié)構(gòu)框架不等同于體系結(jié)構(gòu) 體系結(jié)構(gòu)確定了軟件系統(tǒng)整體結(jié)構(gòu)、層次劃分,不同體系結(jié)構(gòu)確定了軟件系統(tǒng)整體結(jié)構(gòu)、層次劃分,不同部分之間的協(xié)作等設(shè)計(jì)考慮;而框架比體系結(jié)構(gòu)更具體部分之間的協(xié)作等設(shè)計(jì)考慮;而框架比體系結(jié)構(gòu)更具體,更偏重于技術(shù)。確定框架后,

35、軟件體系結(jié)構(gòu)也隨之確,更偏重于技術(shù)。確定框架后,軟件體系結(jié)構(gòu)也隨之確定,而對(duì)于同一體系結(jié)構(gòu)(如定,而對(duì)于同一體系結(jié)構(gòu)(如B/S架構(gòu)),可以通過(guò)多架構(gòu)),可以通過(guò)多種框架(種框架(SSH等)來(lái)實(shí)現(xiàn)等)來(lái)實(shí)現(xiàn)體系結(jié)構(gòu)和設(shè)計(jì)模式通常出現(xiàn)在軟件設(shè)計(jì)的不同階段體系結(jié)構(gòu)和設(shè)計(jì)模式通常出現(xiàn)在軟件設(shè)計(jì)的不同階段 軟件架構(gòu)通常出現(xiàn)在軟件概要設(shè)計(jì)的早期;而單個(gè)設(shè)軟件架構(gòu)通常出現(xiàn)在軟件概要設(shè)計(jì)的早期;而單個(gè)設(shè)計(jì)模式不能完成一個(gè)完整的軟件體系結(jié)構(gòu)的詳細(xì)構(gòu)造,計(jì)模式不能完成一個(gè)完整的軟件體系結(jié)構(gòu)的詳細(xì)構(gòu)造,故通常用在軟件詳細(xì)設(shè)計(jì)階段故通常用在軟件詳細(xì)設(shè)計(jì)階段40設(shè)計(jì)模式和框架在軟件設(shè)計(jì)中是兩種不同的研究設(shè)計(jì)模式和框架在

36、軟件設(shè)計(jì)中是兩種不同的研究 框架給出的是整個(gè)應(yīng)用的體系結(jié)構(gòu),而設(shè)計(jì)模式則給框架給出的是整個(gè)應(yīng)用的體系結(jié)構(gòu),而設(shè)計(jì)模式則給出單一設(shè)計(jì)問(wèn)題的解決方案,并且這個(gè)方案可在不同的出單一設(shè)計(jì)問(wèn)題的解決方案,并且這個(gè)方案可在不同的應(yīng)用程序或者框架中進(jìn)行應(yīng)用;應(yīng)用程序或者框架中進(jìn)行應(yīng)用; 構(gòu)件通常是代碼重用,而設(shè)計(jì)模式是設(shè)計(jì)重用(這個(gè)構(gòu)件通常是代碼重用,而設(shè)計(jì)模式是設(shè)計(jì)重用(這個(gè)設(shè)計(jì)可被不同語(yǔ)言以不用方式來(lái)實(shí)現(xiàn)),框架則介于兩設(shè)計(jì)可被不同語(yǔ)言以不用方式來(lái)實(shí)現(xiàn)),框架則介于兩者之間,部分代碼重用,部分設(shè)計(jì)重用者之間,部分代碼重用,部分設(shè)計(jì)重用414243設(shè)計(jì)原則名稱設(shè)計(jì)原則簡(jiǎn)介重要性單一職責(zé)原則 (SRP)類的

37、職責(zé)要單一,不能將太多的職責(zé)放在一個(gè)類中,盡量做到松耦合開(kāi)閉原則 (OCP)對(duì)擴(kuò)展是開(kāi)放的,對(duì)修改是關(guān)閉的,即在不修改已有程序代碼的基礎(chǔ)上去擴(kuò)展其功能里氏代換原則 (LSP)在軟件系統(tǒng)中,一個(gè)可以接受基類對(duì)象的地方必然可以接受一個(gè)子類對(duì)象依賴倒轉(zhuǎn)原則 (DIP)要針對(duì)抽象層編程,而不要針對(duì)具體類編程接口隔離原則 (ISP)使用多個(gè)專門的接口來(lái)取代一個(gè)統(tǒng)一的接口 合成復(fù)用原則 (CRP)在系統(tǒng)中應(yīng)該盡量多使用組合和聚合關(guān)聯(lián)關(guān)系,盡量少使用甚至不使用繼承關(guān)系迪米特法則 (LoD)如果兩個(gè)類不必彼此直接通信,那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接的相互作用,而是通過(guò)引入一個(gè)第三者發(fā)生間接交互一個(gè)對(duì)象應(yīng)該只包含

38、單一的職責(zé),并且該職責(zé)被完整地一個(gè)對(duì)象應(yīng)該只包含單一的職責(zé),并且該職責(zé)被完整地封裝在一個(gè)類中,如果一個(gè)類(或者大到模塊,小到方封裝在一個(gè)類中,如果一個(gè)類(或者大到模塊,小到方法)承擔(dān)的職責(zé)越多,就相當(dāng)于將這些職責(zé)功能耦合在法)承擔(dān)的職責(zé)越多,就相當(dāng)于將這些職責(zé)功能耦合在一起,那么它被復(fù)用的可能性就越小一起,那么它被復(fù)用的可能性就越小類的職責(zé)主要包括兩個(gè)方面:數(shù)據(jù)職責(zé)和行為職責(zé),數(shù)類的職責(zé)主要包括兩個(gè)方面:數(shù)據(jù)職責(zé)和行為職責(zé),數(shù)據(jù)職責(zé)通過(guò)其屬性來(lái)體現(xiàn),而行為職責(zé)通過(guò)其方法來(lái)體據(jù)職責(zé)通過(guò)其屬性來(lái)體現(xiàn),而行為職責(zé)通過(guò)其方法來(lái)體現(xiàn)現(xiàn)單一職責(zé)原則是實(shí)現(xiàn)高內(nèi)聚、低耦合的指導(dǎo)方針,它是單一職責(zé)原則是實(shí)現(xiàn)高內(nèi)

39、聚、低耦合的指導(dǎo)方針,它是最簡(jiǎn)單但又最難運(yùn)用的原則,需要設(shè)計(jì)人員具有較強(qiáng)的最簡(jiǎn)單但又最難運(yùn)用的原則,需要設(shè)計(jì)人員具有較強(qiáng)的分析設(shè)計(jì)能力和相關(guān)重構(gòu)經(jīng)驗(yàn),以分離類的不同職責(zé)分析設(shè)計(jì)能力和相關(guān)重構(gòu)經(jīng)驗(yàn),以分離類的不同職責(zé)4445軟件研發(fā)過(guò)程中可以對(duì)其進(jìn)行功能擴(kuò)展軟件研發(fā)過(guò)程中可以對(duì)其進(jìn)行功能擴(kuò)展(開(kāi)放開(kāi)放),但并不,但并不需要對(duì)原來(lái)已有代碼進(jìn)行修改需要對(duì)原來(lái)已有代碼進(jìn)行修改(關(guān)閉關(guān)閉),即通過(guò)不斷擴(kuò)展,即通過(guò)不斷擴(kuò)展新模塊滿足變化的新需求,使軟件系統(tǒng)在擁有適應(yīng)性和新模塊滿足變化的新需求,使軟件系統(tǒng)在擁有適應(yīng)性和擴(kuò)展性的同時(shí)具有較好的穩(wěn)定性和延續(xù)性擴(kuò)展性的同時(shí)具有較好的穩(wěn)定性和延續(xù)性u(píng)實(shí)現(xiàn)的主要原則實(shí)

40、現(xiàn)的主要原則u 抽象原則抽象原則:利用接口、抽象類等機(jī)制定義抽象層,擴(kuò)展功能時(shí)并利用接口、抽象類等機(jī)制定義抽象層,擴(kuò)展功能時(shí)并不改動(dòng)抽象層,只需要增加新的具體類來(lái)實(shí)現(xiàn)新功能不改動(dòng)抽象層,只需要增加新的具體類來(lái)實(shí)現(xiàn)新功能u 可變性封裝原則可變性封裝原則(Principle of Encapsulation of Variation, EVP) :對(duì)系統(tǒng)所有可能發(fā)生變化的部分進(jìn)行評(píng)估對(duì)系統(tǒng)所有可能發(fā)生變化的部分進(jìn)行評(píng)估和分類,每一個(gè)可變的因素都單獨(dú)進(jìn)行封裝和分類,每一個(gè)可變的因素都單獨(dú)進(jìn)行封裝4647LoginForm- button : CircleButton+ display () : vo

41、idCircleButton+ view () : voidLoginForm- button : RectangleButton+ display () : voidRectangleButton+ view () : void某圖形界面系統(tǒng)提供了各種不同形狀的按鈕,客戶端代某圖形界面系統(tǒng)提供了各種不同形狀的按鈕,客戶端代碼可針對(duì)這些按鈕進(jìn)行編程,用戶可能會(huì)改變需求要求碼可針對(duì)這些按鈕進(jìn)行編程,用戶可能會(huì)改變需求要求使用不同的按鈕,如使用菱形按鈕,怎么辦?使用不同的按鈕,如使用菱形按鈕,怎么辦?是實(shí)現(xiàn)開(kāi)閉原則的重要方式之一是實(shí)現(xiàn)開(kāi)閉原則的重要方式之一如果能夠使用基類對(duì)象,那么一定能夠使用其子

42、類對(duì)象如果能夠使用基類對(duì)象,那么一定能夠使用其子類對(duì)象。把基類都替換成它的子類,程序?qū)⒉粫?huì)產(chǎn)生任何錯(cuò)誤。把基類都替換成它的子類,程序?qū)⒉粫?huì)產(chǎn)生任何錯(cuò)誤和異常,反過(guò)來(lái)則不一定成立和異常,反過(guò)來(lái)則不一定成立基類被真正復(fù)用,派生類能夠在基類的基礎(chǔ)上增加新的基類被真正復(fù)用,派生類能夠在基類的基礎(chǔ)上增加新的行為;在程序中盡量使用基類類型來(lái)對(duì)對(duì)象進(jìn)行定義,行為;在程序中盡量使用基類類型來(lái)對(duì)對(duì)象進(jìn)行定義,而在運(yùn)行時(shí)再確定其子類類型,用子類對(duì)象來(lái)替換父類而在運(yùn)行時(shí)再確定其子類類型,用子類對(duì)象來(lái)替換父類對(duì)象對(duì)象4849對(duì)重要數(shù)據(jù)的加密處理,在對(duì)重要數(shù)據(jù)的加密處理,在DataOperator 類中調(diào)用加類中調(diào)用加

43、密類密類(CipherA和和CipherB)中實(shí)現(xiàn)的不同加密算法,如中實(shí)現(xiàn)的不同加密算法,如果更換或增加一個(gè)加密算法類時(shí)怎么辦?果更換或增加一個(gè)加密算法類時(shí)怎么辦?針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程 類的抽象耦合類的抽象耦合 代碼要依賴于抽象的類,而不要依賴于具體的類代碼要依賴于抽象的類,而不要依賴于具體的類 在程序代碼中傳遞參數(shù)時(shí)或在組合聚合關(guān)系中,盡量引在程序代碼中傳遞參數(shù)時(shí)或在組合聚合關(guān)系中,盡量引用層次高的抽象類,也就是用層次高的抽象類,也就是使用抽象類或接口進(jìn)行變量使用抽象類或接口進(jìn)行變量類型聲明、參數(shù)類型聲明、方法返回類型聲明、數(shù)據(jù)類類型聲明、參數(shù)類型聲明

44、、方法返回類型聲明、數(shù)據(jù)類型的轉(zhuǎn)換等型的轉(zhuǎn)換等,而不用具體的類來(lái)實(shí)現(xiàn)這些事情,而不用具體的類來(lái)實(shí)現(xiàn)這些事情 里氏替換原則是依賴倒轉(zhuǎn)原則的基礎(chǔ)(一個(gè)具體類應(yīng)該里氏替換原則是依賴倒轉(zhuǎn)原則的基礎(chǔ)(一個(gè)具體類應(yīng)該只實(shí)現(xiàn)抽象類中聲明過(guò)的方法,否則將無(wú)法調(diào)用在子類只實(shí)現(xiàn)抽象類中聲明過(guò)的方法,否則將無(wú)法調(diào)用在子類中增加的新方法),而這兩者都是開(kāi)閉原則的一種具體中增加的新方法),而這兩者都是開(kāi)閉原則的一種具體實(shí)現(xiàn)方法實(shí)現(xiàn)方法5051系統(tǒng)提供一個(gè)數(shù)據(jù)轉(zhuǎn)換模塊,可以將來(lái)自不同數(shù)據(jù)源(系統(tǒng)提供一個(gè)數(shù)據(jù)轉(zhuǎn)換模塊,可以將來(lái)自不同數(shù)據(jù)源(數(shù)據(jù)庫(kù)、文本等)的數(shù)據(jù)轉(zhuǎn)換成不同的顯示格式(數(shù)據(jù)庫(kù)、文本等)的數(shù)據(jù)轉(zhuǎn)換成不同的顯示格

45、式(XML、XLS),那么,增加新數(shù)據(jù)源或新顯示格式怎么辦?),那么,增加新數(shù)據(jù)源或新顯示格式怎么辦?多個(gè)和客戶相關(guān)的接口要好于一個(gè)通用接口多個(gè)和客戶相關(guān)的接口要好于一個(gè)通用接口如果一個(gè)類有幾個(gè)使用者,與其讓這個(gè)類載入所有使用如果一個(gè)類有幾個(gè)使用者,與其讓這個(gè)類載入所有使用者需要使用的所有方法,還不如為不同的使用者提供寬者需要使用的所有方法,還不如為不同的使用者提供寬窄不同的接口,讓該類分別實(shí)現(xiàn)這些接口,為不同使用窄不同的接口,讓該類分別實(shí)現(xiàn)這些接口,為不同使用者提供其所需的具體方法行為者提供其所需的具體方法行為使用接口隔離原則拆分接口時(shí),首先必須滿足單一職責(zé)使用接口隔離原則拆分接口時(shí),首先必

46、須滿足單一職責(zé)原則,將一組相關(guān)的操作定義在一個(gè)接口中,且在滿足原則,將一組相關(guān)的操作定義在一個(gè)接口中,且在滿足高內(nèi)聚的前提下,接口中的方法越少越好高內(nèi)聚的前提下,接口中的方法越少越好5253有多個(gè)客戶類的系統(tǒng),定義一個(gè)有多個(gè)客戶類的系統(tǒng),定義一個(gè)AbstractService胖接胖接口來(lái)服務(wù)所有的客戶類,那么,口來(lái)服務(wù)所有的客戶類,那么,ClientA能看到不相干能看到不相干的的operatorB和和operatorC方法,封裝性差怎么辦?方法,封裝性差怎么辦?ClientAAbstractServiceA+ operatorA ().: voidClientBClientCConcreteS

47、ervice+operatorA ()operatorB ()operatorC (): void: void: voidAbstractServiceB+ operatorB ().: voidAbstractServiceC+ operatorC ().: void盡量使用對(duì)象組合,而不是繼承來(lái)達(dá)到復(fù)用的目的盡量使用對(duì)象組合,而不是繼承來(lái)達(dá)到復(fù)用的目的在一個(gè)新的對(duì)象里通過(guò)關(guān)聯(lián)關(guān)系(包括組合關(guān)系和聚合在一個(gè)新的對(duì)象里通過(guò)關(guān)聯(lián)關(guān)系(包括組合關(guān)系和聚合關(guān)系)來(lái)使用一些已有的對(duì)象,使之成為新對(duì)象的一部關(guān)系)來(lái)使用一些已有的對(duì)象,使之成為新對(duì)象的一部分;新對(duì)象通過(guò)委派調(diào)用已有對(duì)象的方法達(dá)到復(fù)用其已分

48、;新對(duì)象通過(guò)委派調(diào)用已有對(duì)象的方法達(dá)到復(fù)用其已有功能的目的有功能的目的54 1. 新的實(shí)現(xiàn)很容易,因?yàn)榇蟛糠质抢^承而來(lái)的新的實(shí)現(xiàn)很容易,因?yàn)榇蟛糠质抢^承而來(lái)的 2. 很容易修改和擴(kuò)展已有的實(shí)現(xiàn)很容易修改和擴(kuò)展已有的實(shí)現(xiàn) 1. 打破了封裝,因?yàn)榛愊蜃宇惐┞读藢?shí)現(xiàn)細(xì)節(jié)打破了封裝,因?yàn)榛愊蜃宇惐┞读藢?shí)現(xiàn)細(xì)節(jié) 2. 白盒重用白盒重用,因?yàn)榛惖膬?nèi)部細(xì)節(jié)通常對(duì)子類可見(jiàn),因?yàn)榛惖膬?nèi)部細(xì)節(jié)通常對(duì)子類可見(jiàn) 3. 當(dāng)父類的實(shí)現(xiàn)改變時(shí)可能要相應(yīng)的對(duì)子類做出改變當(dāng)父類的實(shí)現(xiàn)改變時(shí)可能要相應(yīng)的對(duì)子類做出改變 4. 不能在運(yùn)行時(shí)改變由父類繼承來(lái)的實(shí)現(xiàn)不能在運(yùn)行時(shí)改變由父類繼承來(lái)的實(shí)現(xiàn)55 1. 被包含對(duì)象通過(guò)包含

49、他們的類來(lái)訪問(wèn)被包含對(duì)象通過(guò)包含他們的類來(lái)訪問(wèn) 2. 黑盒重用黑盒重用,因?yàn)楸话瑢?duì)象的內(nèi)部細(xì)節(jié)是不可見(jiàn)的,因?yàn)楸话瑢?duì)象的內(nèi)部細(xì)節(jié)是不可見(jiàn)的 3. 很好的封裝,每個(gè)類專注于一個(gè)任務(wù)很好的封裝,每個(gè)類專注于一個(gè)任務(wù) 4. 通過(guò)獲得和被包含對(duì)象的類型相同的對(duì)象引用,可通過(guò)獲得和被包含對(duì)象的類型相同的對(duì)象引用,可以在運(yùn)行時(shí)動(dòng)態(tài)定義組合的方式以在運(yùn)行時(shí)動(dòng)態(tài)定義組合的方式 1. 結(jié)果系統(tǒng)可能會(huì)包含更多的對(duì)象結(jié)果系統(tǒng)可能會(huì)包含更多的對(duì)象 2. 為了使組合時(shí)可以使用不同的對(duì)象,必須小心的為了使組合時(shí)可以使用不同的對(duì)象,必須小心的 定義接口定義接口5657如果需要更換數(shù)據(jù)庫(kù)連接方式,如如果需要更換數(shù)據(jù)庫(kù)連接

50、方式,如JDBC改為連接池,則改為連接池,則需要修改需要修改DBUtil類源代碼。如果類源代碼。如果StudentDAO采用采用JDBC連接,但是連接,但是TeacherDAO采用連接池連接,則需采用連接池連接,則需要修改大量源碼,違背開(kāi)閉原則,系統(tǒng)擴(kuò)展性較差要修改大量源碼,違背開(kāi)閉原則,系統(tǒng)擴(kuò)展性較差DBUtil+ getConnection ().: ConnectionStudentDAO- dBOperator : DBUtil+setDBOperator (DBUtil dBOperator)findStudentById (String id)findAllStudents ()s

51、ave (StudentDTO student).: void: StudentDTO: List: intTeacherDAO- dBOperator : DBUtil+setDBOperator (DBUtil dBOperator)findTeacherById (String id)findAllTeachers ()save (TeacherDTO teacher).: void: TeacherDTO: List: intNewDBUtil+ getConnection ().: Connection簡(jiǎn)單地說(shuō),迪米特法則就是指一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能簡(jiǎn)單地說(shuō),迪米特法則就是指一個(gè)軟件

52、實(shí)體應(yīng)當(dāng)盡可能少的與其他實(shí)體發(fā)生相互作用。這樣,當(dāng)一個(gè)模塊修改少的與其他實(shí)體發(fā)生相互作用。這樣,當(dāng)一個(gè)模塊修改時(shí),就會(huì)盡量少的影響其他的模塊,擴(kuò)展會(huì)相對(duì)容易,時(shí),就會(huì)盡量少的影響其他的模塊,擴(kuò)展會(huì)相對(duì)容易,這是對(duì)軟件實(shí)體之間通信的限制這是對(duì)軟件實(shí)體之間通信的限制如果兩個(gè)類之間不必彼此直接通信,那么這兩個(gè)類就不如果兩個(gè)類之間不必彼此直接通信,那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接的相互作用,如果其中的一個(gè)類需要調(diào)用應(yīng)當(dāng)發(fā)生直接的相互作用,如果其中的一個(gè)類需要調(diào)用另一個(gè)類的某一個(gè)方法的話,可以通過(guò)第三者轉(zhuǎn)發(fā)這個(gè)另一個(gè)類的某一個(gè)方法的話,可以通過(guò)第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用調(diào)用降低類之間的耦合,但是會(huì)在系統(tǒng)中增加大量的

53、小方法降低類之間的耦合,但是會(huì)在系統(tǒng)中增加大量的小方法并散落在系統(tǒng)的各個(gè)角落,造成系統(tǒng)的不同模塊之間的并散落在系統(tǒng)的各個(gè)角落,造成系統(tǒng)的不同模塊之間的通信效率降低通信效率降低5859某系統(tǒng)界面類某系統(tǒng)界面類(如如Form1、Form2等類等類)與數(shù)據(jù)訪問(wèn)類與數(shù)據(jù)訪問(wèn)類(如如DAO1、DAO2等類等類)之間的調(diào)用關(guān)系較為復(fù)雜,怎么之間的調(diào)用關(guān)系較為復(fù)雜,怎么調(diào)整會(huì)滿足迪米特法則?調(diào)整會(huì)滿足迪米特法則?Form1Form2Form3Form4Form5DAO1DAO2DAO3DAO4Controller1Controller26061考慮設(shè)計(jì)模式是怎樣解決設(shè)計(jì)問(wèn)題的考慮設(shè)計(jì)模式是怎樣解決設(shè)計(jì)問(wèn)題的

54、瀏覽模式的意圖部分瀏覽模式的意圖部分研究模式怎樣相互關(guān)聯(lián)研究模式怎樣相互關(guān)聯(lián)研究目的相似的模式研究目的相似的模式檢查重新設(shè)計(jì)的原因檢查重新設(shè)計(jì)的原因考慮你的設(shè)計(jì)中哪些是可變的考慮你的設(shè)計(jì)中哪些是可變的62大致瀏覽一遍設(shè)計(jì)模式的描述,特別注意適用性和效果大致瀏覽一遍設(shè)計(jì)模式的描述,特別注意適用性和效果部分的說(shuō)明,確定它適合你的問(wèn)題部分的說(shuō)明,確定它適合你的問(wèn)題研究模式的結(jié)構(gòu)部分、參與者部分和協(xié)作部分研究模式的結(jié)構(gòu)部分、參與者部分和協(xié)作部分研究代碼示例部分,看看這個(gè)模式代碼形式的具體例子研究代碼示例部分,看看這個(gè)模式代碼形式的具體例子選擇模式參與者的名字,使其在應(yīng)用上下文中有意義選擇模式參與者的名

55、字,使其在應(yīng)用上下文中有意義定義類定義類定義模式中專用于應(yīng)用的操作名稱定義模式中專用于應(yīng)用的操作名稱實(shí)現(xiàn)執(zhí)行模式中責(zé)任和協(xié)作的操作實(shí)現(xiàn)執(zhí)行模式中責(zé)任和協(xié)作的操作63不是軟件的任何部分都需要套用模式來(lái)設(shè)計(jì)的,必須針不是軟件的任何部分都需要套用模式來(lái)設(shè)計(jì)的,必須針對(duì)具體問(wèn)題合理的使用模式對(duì)具體問(wèn)題合理的使用模式1、正確使用、正確使用 當(dāng)設(shè)計(jì)軟件系統(tǒng),并確認(rèn)所遇到的問(wèn)題剛好適合使用某個(gè)模式,當(dāng)設(shè)計(jì)軟件系統(tǒng),并確認(rèn)所遇到的問(wèn)題剛好適合使用某個(gè)模式,就可以考慮使用該模式到你的系統(tǒng)設(shè)計(jì)中,能使設(shè)計(jì)的系統(tǒng)易維就可以考慮使用該模式到你的系統(tǒng)設(shè)計(jì)中,能使設(shè)計(jì)的系統(tǒng)易維護(hù)、可擴(kuò)展性強(qiáng)、復(fù)用性好,而且容易讓其他開(kāi)發(fā)

56、人員了解你的護(hù)、可擴(kuò)展性強(qiáng)、復(fù)用性好,而且容易讓其他開(kāi)發(fā)人員了解你的系統(tǒng)和設(shè)計(jì)思想系統(tǒng)和設(shè)計(jì)思想2、避免教條、避免教條 設(shè)計(jì)模式不是數(shù)學(xué)公式、物理定律、更不是軟件設(shè)計(jì)中的法律條設(shè)計(jì)模式不是數(shù)學(xué)公式、物理定律、更不是軟件設(shè)計(jì)中的法律條文,一個(gè)模式只是成功解決某個(gè)特定問(wèn)題的設(shè)計(jì)方案,你完全可文,一個(gè)模式只是成功解決某個(gè)特定問(wèn)題的設(shè)計(jì)方案,你完全可以修改模式中的部分結(jié)構(gòu)以符合你的設(shè)計(jì)要求以修改模式中的部分結(jié)構(gòu)以符合你的設(shè)計(jì)要求643、模式挖掘、模式挖掘 模式不是用理論推導(dǎo)出來(lái)的,而是從真實(shí)世界的軟件系統(tǒng)中被發(fā)模式不是用理論推導(dǎo)出來(lái)的,而是從真實(shí)世界的軟件系統(tǒng)中被發(fā)現(xiàn)、按著一定規(guī)范總結(jié)出來(lái)的可以被復(fù)用的方案。許多文獻(xiàn)或書(shū)現(xiàn)、按著一定規(guī)范總結(jié)出來(lái)的可以被復(fù)用的

溫馨提示

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

評(píng)論

0/150

提交評(píng)論