版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、軟件設(shè)計(jì)模式1學(xué)習(xí)面向?qū)ο笤O(shè)計(jì)中前人最有價(jià)值的經(jīng)驗(yàn)總結(jié)-設(shè)計(jì)模式。以便重用優(yōu)秀、簡(jiǎn)單的、經(jīng)過(guò)驗(yàn)證的問(wèn)題解決方案。設(shè)計(jì)模式實(shí)際上討論的是在解決面向?qū)ο笤O(shè)計(jì)的某類問(wèn)題時(shí),應(yīng)該設(shè)計(jì)那些類,這些類之間應(yīng)該如何通信。設(shè)計(jì)模式使人們可以更加簡(jiǎn)單方便地復(fù)用成功的設(shè)計(jì)和體系結(jié)構(gòu)。將已證實(shí)的技術(shù)表述成設(shè)計(jì)模式也會(huì)使新系統(tǒng)開(kāi)發(fā)者更加容易理解其設(shè)計(jì)思路。設(shè)計(jì)模式幫助你做出有利于系統(tǒng)復(fù)用的選擇,避免設(shè)計(jì)損害了系統(tǒng)復(fù)用性。通過(guò)提供一個(gè)顯式類和對(duì)象作用關(guān)系以及它們之間潛在聯(lián)系的說(shuō)明規(guī)范,設(shè)計(jì)模式甚至能夠提高已有系統(tǒng)的文檔管理和系統(tǒng)維護(hù)的有效性。簡(jiǎn)而言之,設(shè)計(jì)模式可以幫助設(shè)計(jì)者更快更好地完成系統(tǒng)設(shè)計(jì)。學(xué)習(xí)設(shè)計(jì)模式的重要性課
2、程目的2參考書(shū)目(美) GoF, 設(shè)計(jì)模式-可服用的面向?qū)ο筌浖幕A(chǔ),機(jī)械工業(yè)出版社,2005 (美)Elisabeth Freeman,Eric Freeman,Bert Bates,Kathy Sierra ,深入淺出設(shè)計(jì)模式(英文影印版),東南大學(xué)出版社,2005(美)Alan Shalloway,James R.Trott,設(shè)計(jì)模式精解,清華大學(xué)出版社,2004潔城 浩,設(shè)計(jì)模式-JAVA語(yǔ)言中的應(yīng)用,中國(guó)鐵道出版社2005.1(板橋里人) 3第一章 引言主要內(nèi)容什么是設(shè)計(jì)模式設(shè)計(jì)模式的描述設(shè)計(jì)模是怎樣解決設(shè)計(jì)問(wèn)題怎樣選擇設(shè)計(jì)模式怎樣使用設(shè)計(jì)模式4什么是設(shè)計(jì)模式著名建筑師Christ
3、opher Alexander 說(shuō)過(guò):“每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問(wèn)題,以及該問(wèn)題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重復(fù)勞動(dòng)”他的思想也同樣適用于面向?qū)ο笤O(shè)計(jì)模式,只是在面向?qū)ο蟮慕鉀Q方案里,我們用對(duì)象和接口代替了墻壁和門窗。兩類模式的核心都在于提供了相關(guān)問(wèn)題的解決方案。設(shè)計(jì)模式并不是一種具體技術(shù),它講述的是思想,它不僅僅展示了接口或抽象類在實(shí)際案例中的靈活應(yīng)用和智慧,讓你能夠真正掌握接口或抽象類的應(yīng)用,從而 在原來(lái)的Java語(yǔ)言基礎(chǔ)上躍進(jìn)一步,更重要的是,GoF的設(shè)計(jì)模式反復(fù)向你強(qiáng)調(diào)一個(gè)宗旨:要讓你的程序盡可能的可重用。 5設(shè)計(jì)模式內(nèi)行的設(shè)計(jì)者知道
4、:不是解決任何問(wèn)題都要從頭做起。他們更愿意復(fù)用以前使用過(guò)的解決方案。當(dāng)找到一個(gè)好的解決方案,他們會(huì)一遍又一遍地使用。這些經(jīng)驗(yàn)是他們成為內(nèi)行的部分原因。因此,你會(huì)在許多面向?qū)ο笙到y(tǒng)中看到類和相互通信的對(duì)象( c o m m u n i c a t i n go b j e c t)的重復(fù)模式。這些模式解決特定的設(shè)計(jì)問(wèn)題,使面向?qū)ο笤O(shè)計(jì)更靈活、優(yōu)雅,最終復(fù)用性更好。它們幫助設(shè)計(jì)者將新的設(shè)計(jì)建立在以往工作的基礎(chǔ)上,復(fù)用以往成功的設(shè)計(jì)方案。一個(gè)熟悉這些模式的設(shè)計(jì)者不需要再去發(fā)現(xiàn)它們,而能夠立即將它們應(yīng)用于設(shè)計(jì)問(wèn)題中。6設(shè)計(jì)模式設(shè)計(jì)模式是人們對(duì)成功的,可供重復(fù)使用的設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。學(xué)習(xí)設(shè)計(jì)模式使人們可以
5、更加簡(jiǎn)單方便地復(fù)用成功的設(shè)計(jì)和體系結(jié)構(gòu)。將已證實(shí)的技術(shù)表述成設(shè)計(jì)模式也會(huì)使新系統(tǒng)開(kāi)發(fā)者更加容易理解其設(shè)計(jì)思路。設(shè)計(jì)模式幫助你做出有利于系統(tǒng)復(fù)用的選擇,避免設(shè)計(jì)損害了系統(tǒng)復(fù)用性。通過(guò)提供一個(gè)顯式類和對(duì)象作用關(guān)系以及它們之間潛在聯(lián)系的說(shuō)明規(guī)范,設(shè)計(jì)模式甚至能夠提高已有系統(tǒng)的文檔管理和系統(tǒng)維護(hù)的有效性。簡(jiǎn)而言之,設(shè)計(jì)模式可以幫助設(shè)計(jì)者更快更好地完成系統(tǒng)設(shè)計(jì)。7設(shè)計(jì)模式的定義一個(gè)設(shè)計(jì)模式命名、抽象和確定了一個(gè)通用設(shè)計(jì)結(jié)構(gòu)的主要方面,這些設(shè)計(jì)結(jié)構(gòu)能被用來(lái)構(gòu)造可復(fù)用的面向?qū)ο笤O(shè)計(jì)。設(shè)計(jì)模式確定了所包含的類和實(shí)例,它們的角色、協(xié)作方式以及職責(zé)分配。每一個(gè)設(shè)計(jì)模式都集中于一個(gè)特定的面向?qū)ο笤O(shè)計(jì)問(wèn)題或設(shè)計(jì)要點(diǎn),
6、描述了什么時(shí)候使用它,在另一些設(shè)計(jì)約束條件下是否還能使用,以及使用的效果和如何取舍。8模式的四個(gè)要素模式名稱(pattern name) 一個(gè)助記名,它用一兩個(gè)詞來(lái)描述模式的問(wèn)題、解決方案和效果。問(wèn)題(problem) 描述了應(yīng)該在何時(shí)使用模式。它解釋了設(shè)計(jì)問(wèn)題和問(wèn)題存在的前因后果,它可能描述了特定的設(shè)計(jì)問(wèn)題,如怎樣用對(duì)象表示算法等。也可能描述了導(dǎo)致不靈活設(shè)計(jì)的類或?qū)ο蠼Y(jié)構(gòu)。有時(shí)候,問(wèn)題部分會(huì)包括使用模式必須滿足的一系列先決條件。解決方案(solution) 描述了設(shè)計(jì)的組成成分,它們之間的相互關(guān)系及各自的職責(zé)和協(xié)作方式。因?yàn)槟J骄拖褚粋€(gè)模板,可應(yīng)用于多種不同場(chǎng)合,所以解決方案并不描述一個(gè)特定
7、而具體的設(shè)計(jì)或?qū)崿F(xiàn),而是提供設(shè)計(jì)問(wèn)題的抽象描述和怎樣用一個(gè)具有一般意義的元素組合(類或?qū)ο蠼M合)來(lái)解決這個(gè)問(wèn)題。效果(consequences) 描述了模式應(yīng)用的效果及使用模式應(yīng)權(quán)衡的問(wèn)題。9描述設(shè)計(jì)模式用統(tǒng)一的格式描述設(shè)計(jì)模式,對(duì)一個(gè)模式的描述包括以下部分:模式名和分類意圖:設(shè)計(jì)模式是做什么的?它的基本原理和意圖是什么?它解決的是什么樣的特定設(shè)計(jì)問(wèn)題?動(dòng)機(jī):用以說(shuō)明一個(gè)設(shè)計(jì)問(wèn)題以及如何用模式中的類、對(duì)象來(lái)解決該問(wèn)題的特定情景。該情景會(huì)幫助你理解隨后對(duì)模式更抽象的描述。適用性:什么情況下可以使用該設(shè)計(jì)模式?該模式可用來(lái)改進(jìn)哪些不良設(shè)計(jì)?你怎樣識(shí)別這些情況?結(jié)構(gòu):采用基于對(duì)象建模技術(shù)對(duì)模式中的類
8、進(jìn)行圖形描述。使用了交互圖來(lái)說(shuō)明對(duì)象之間的請(qǐng)求序列和協(xié)作關(guān)系。10描述設(shè)計(jì)模式(續(xù))參與者:指設(shè)計(jì)模式中的類和/或?qū)ο笠约八鼈兏髯缘穆氊?zé)。協(xié)作:模式的參與者怎樣協(xié)作以實(shí)現(xiàn)它們的職責(zé)。效果:模式怎樣支持它的目標(biāo)?使用模式的效果和所需做的權(quán)衡取舍?系統(tǒng)結(jié)構(gòu)的哪些方面可以獨(dú)立改變?實(shí)現(xiàn):實(shí)現(xiàn)模式時(shí)需要知道的一些提示、技術(shù)要點(diǎn)及應(yīng)避免的缺陷,以及是否存在某些特定于實(shí)現(xiàn)語(yǔ)言的問(wèn)題。代碼示例:用來(lái)說(shuō)明怎樣用Java實(shí)現(xiàn)該模式的代碼片段。已知應(yīng)用:實(shí)際系統(tǒng)中發(fā)現(xiàn)的模式的例子。相關(guān)模式:與這個(gè)模式緊密相關(guān)的模式有哪些?其間重要的不同之處是什么?這個(gè)模式應(yīng)與哪些其他模式一起使用?11設(shè)計(jì)模式的編目Abstrac
9、t Factory( 3 . 1 ):提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)需指定它們具體的類。A d a p t er ( 4 . 1 ):將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。A d a p t e r模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。B r i d g e( 4 . 2 ):將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。B u i l d e r( 3 . 2 ):將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。Chain of Responsibility( 5 . 1 ):為解除請(qǐng)求的發(fā)送者和接收者之間耦合
10、,而使多個(gè)對(duì)象都有機(jī)會(huì)處理這個(gè)請(qǐng)求。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它。12GoF(Gang of Four)Erich GammaRichard HelmRalph JohnsonJohn Vlissides1994合著 Design Patterns Elements of Reusable Object-Oriented Software13設(shè)計(jì)模式的編目C o m m a n d( 5 . 2 ):將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可取消的操作。C o m p o s i t e( 4 .
11、 3 ):將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。C o m p o s i t e使得客戶對(duì)單個(gè)對(duì)象和復(fù)合對(duì)象的使用具有一致性。D e c o r a t o r( 4 . 4 ):動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就擴(kuò)展功能而言, D e c o r a t o r模式比生成子類方式更為靈活。F a c a d e( 4 . 5 ):為子系統(tǒng)中的一組接口提供一個(gè)一致的界面, F a c a d e模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。14設(shè)計(jì)模式的編目Factory Method( 3 . 3 ):定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定將哪一個(gè)類實(shí)例化。
12、Factory Method使一個(gè)類的實(shí)例化延遲到其子類。F l y w e i g h t( 4 . 6 ):運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。I n t e r p r e t e r( 5 . 3 ):給定一個(gè)語(yǔ)言, 定義它的文法的一種表示,并定義一個(gè)解釋器, 該解釋器使用該表示來(lái)解釋語(yǔ)言中的句子。I t e r a t o r( 5 . 4 ):提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素, 而又不需暴露該對(duì)象的內(nèi)部表示。15設(shè)計(jì)模式的編目M e d i a t o r( 5 . 5 ):用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而
13、且可以獨(dú)立地改變它們之間的交互。M e m e n t o( 5 . 6 ):在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到保存的狀態(tài)。O b s e r v e r( 5 . 7 ):定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)刷新。P r o t o t y p e( 3 . 4 ):用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過(guò)拷貝這個(gè)原型來(lái)創(chuàng)建新的對(duì)象。16設(shè)計(jì)模式的編目P r o x y( 4 . 7 ):為其他對(duì)象提供一個(gè)代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。S i n g l e t o
14、 n( 3 . 5 ):保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。S t a t e( 5 . 8 ):允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對(duì)象看起來(lái)似乎修改了它所屬的類。S t r a t e g y (5 . 9 ):定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái), 并且使它們可相互替換。本模式使得算法的變化可獨(dú)立于使用它的客戶。Template Method( 5 . 1 0 ):定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。Vi s i t o r( 5 . 11 ):表示
15、一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。17設(shè)計(jì)模式分類根據(jù)模式目的來(lái)分。即模式是用來(lái)完成什么工作的。模式依據(jù)其目的可分為創(chuàng)建型( C r e a t i o n a l )、結(jié)構(gòu)型( S t r u c t u r a l )、或行為型( B e h a v i o r a l )三種。創(chuàng)建型模式與對(duì)象的創(chuàng)建有關(guān);結(jié)構(gòu)型模式處理類或?qū)ο蟮慕M合;行為型模式對(duì)類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)進(jìn)行描述。根據(jù)模式的范圍分,指定模式主要是用于類還是用于對(duì)象。類模式處理類和子類之間的關(guān)系,這些關(guān)系通過(guò)繼承建立,是靜態(tài)的,在編譯時(shí)刻便確定下來(lái)了。
16、對(duì)象模式處理對(duì)象間的關(guān)系,這些關(guān)系在運(yùn)行時(shí)刻是可以變化的,更具動(dòng)態(tài)性。從某種意義上來(lái)說(shuō),幾乎所有模式都使用繼承機(jī)制,所以“類模式”只指那些集中于處理類間關(guān)系的模式,而大部分模式都屬于對(duì)象模式的范疇。18模式分類表19模式之間的關(guān)系還有一種方式是根據(jù)模式的“相關(guān)模式”部分所描述的它們?cè)鯓踊ハ嘁脕?lái)組織設(shè)計(jì)模式。圖1 - 1給出了模式關(guān)系的圖形說(shuō)明。20設(shè)計(jì)模式怎樣解決設(shè)計(jì)問(wèn)題設(shè)計(jì)模式采用多種方法解決面向?qū)ο笤O(shè)計(jì)者經(jīng)常碰到的問(wèn)題。這里給出幾個(gè)問(wèn)題以及使用設(shè)計(jì)模式解決它們的方法。尋找合適的對(duì)象決定對(duì)象的粒度指定對(duì)象接口描述對(duì)象的實(shí)現(xiàn)運(yùn)用復(fù)用機(jī)制關(guān)聯(lián)運(yùn)行時(shí)刻和編譯時(shí)刻的結(jié)構(gòu)設(shè)計(jì)應(yīng)支持變化21設(shè)計(jì)模式幫
17、助尋找合適的對(duì)象面向?qū)ο笤O(shè)計(jì)最困難的部分是將系統(tǒng)分解成對(duì)象集合。因?yàn)橐紤]許多因素:封裝、粒度、依賴關(guān)系、靈活性、性能、演化、復(fù)用等等,它們都影響著系統(tǒng)的分解,并且這些因素通常還是互相沖突的。設(shè)計(jì)的許多對(duì)象來(lái)源于現(xiàn)實(shí)世界的分析模型。但是,設(shè)計(jì)結(jié)果所得到的類通常在現(xiàn)實(shí)世界中并不存在。嚴(yán)格反映當(dāng)前現(xiàn)實(shí)世界的模型并不能產(chǎn)生也能反映將來(lái)世界的系統(tǒng)。設(shè)計(jì)中的抽象對(duì)于產(chǎn)生靈活的設(shè)計(jì)是至關(guān)重要的。設(shè)計(jì)模式可以幫助確定并不明顯的抽象和描述這些抽象的對(duì)象。例如,描述過(guò)程或算法的對(duì)象現(xiàn)實(shí)中并不存在,但它們卻是設(shè)計(jì)的關(guān)鍵部分。S t r a t e g y 模式描述了怎樣實(shí)現(xiàn)可互換的算法族。S t a t e 模式
18、將實(shí)體的每一個(gè)狀態(tài)描述為一個(gè)對(duì)象。這些對(duì)象在分析階段,甚至在設(shè)計(jì)階段的早期都并不存在,后來(lái)為使設(shè)計(jì)更靈活、復(fù)用性更好才將它們發(fā)掘出來(lái)。22設(shè)計(jì)模式幫助決定對(duì)象的粒度對(duì)象在大小和數(shù)目上變化極大。它們能表示下自硬件或上自整個(gè)應(yīng)用的任何事物。那么我們?cè)鯓記Q定一個(gè)對(duì)象應(yīng)該是什么呢?設(shè)計(jì)模式很好地講述了這個(gè)問(wèn)題。F a c a d e 模式描述了怎樣用對(duì)象表示完整的子系統(tǒng),F(xiàn) l y w e i g h t 模式描述了如何支持大量的最小粒度的對(duì)象。其他一些設(shè)計(jì)模式描述了將一個(gè)對(duì)象分解成許多小對(duì)象的特定方法。Abstract Factory和B u i l d e r 產(chǎn)生那些專門負(fù)責(zé)生成其他對(duì)象的對(duì)象。
19、Vi s i t o r 和C o m m a n d 生成的對(duì)象專門負(fù)責(zé)實(shí)現(xiàn)對(duì)其他對(duì)象或?qū)ο蠼M的請(qǐng)求。23對(duì)象接口一個(gè)操作對(duì)應(yīng)的操作名、作為參數(shù)的對(duì)象和返回值,這就是所謂的操作的型構(gòu)( s i g n a t u r e )。一個(gè)對(duì)象所定義的所有操作型構(gòu)的集合被稱為該對(duì)象的接口( i n t e r f a c e )。在面向?qū)ο笙到y(tǒng)中,接口是基本的組成部分。對(duì)象只有通過(guò)它們的接口才能與外部交流,如果不通過(guò)對(duì)象的接口就無(wú)法知道對(duì)象的任何事情,也無(wú)法請(qǐng)求對(duì)象做任何事情。對(duì)象接口與其功能實(shí)現(xiàn)是分離的,不同對(duì)象可以對(duì)請(qǐng)求做不同的實(shí)現(xiàn),也就是說(shuō),兩個(gè)有相同接口的對(duì)象可以有完全不同的實(shí)現(xiàn)。24對(duì)象接口
20、(動(dòng)態(tài)綁定)當(dāng)給對(duì)象發(fā)送請(qǐng)求時(shí),所引起的具體操作既與請(qǐng)求本身有關(guān)又與接受對(duì)象有關(guān)。支持相同請(qǐng)求的不同對(duì)象可能對(duì)請(qǐng)求激發(fā)的操作有不同的實(shí)現(xiàn)。發(fā)送給對(duì)象的請(qǐng)求和它的相應(yīng)操作在運(yùn)行時(shí)刻的連接就稱之為動(dòng)態(tài)綁定(dynamic binding)。25對(duì)象接口(多態(tài))動(dòng)態(tài)綁定是指發(fā)送的請(qǐng)求直到運(yùn)行時(shí)刻才受你的具體的實(shí)現(xiàn)的約束。因而,在知道任何有正確接口的對(duì)象都將接受此請(qǐng)求時(shí),你可以寫一個(gè)一般的程序,它期待著那些具有該特定接口的對(duì)象。進(jìn)一步講,動(dòng)態(tài)綁定允許你在運(yùn)行時(shí)刻彼此替換有相同接口的對(duì)象。這種可替換性就稱為多態(tài)( p o l y m o r p h i s m ),它是面向?qū)ο笙到y(tǒng)中的核心概念之一。多態(tài)
21、允許客戶對(duì)象僅要求其他對(duì)象支持特定接口,除此之外對(duì)其假設(shè)幾近于無(wú)。多態(tài)簡(jiǎn)化了客戶的定義,使得對(duì)象間彼此獨(dú)立,并可以在運(yùn)行時(shí)刻動(dòng)態(tài)改變它們相互的關(guān)系。26設(shè)計(jì)模式幫助指定對(duì)象接口設(shè)計(jì)模式通過(guò)確定接口的主要組成成分及經(jīng)接口發(fā)送的數(shù)據(jù)類型,來(lái)幫助你定義接口。設(shè)計(jì)模式也許還會(huì)告訴你接口中不應(yīng)包括哪些東西。M e m e n t o ( 5 . 6 )模式是一個(gè)很好的例子,它描述了怎樣封裝和保存對(duì)象內(nèi)部的狀態(tài),以便一段時(shí)間后對(duì)象能恢復(fù)到這一狀態(tài)。它規(guī)定了M e m e n t o對(duì)象必須定義兩個(gè)接口:一個(gè)允許客戶保持和復(fù)制m e m e n t o的限制接口,和一個(gè)只有原對(duì)象才能使用的用來(lái)儲(chǔ)存和提取m
22、e m e n t o中狀態(tài)的特權(quán)接口。設(shè)計(jì)模式也指定了接口之間的關(guān)系。特別地,它們經(jīng)常要求一些類具有相似的接口;或它們對(duì)一些類的接口做了限制。例如, D e c o r a t o r ( 4 . 4 )和P r o x y ( 4 . 7 )模式要求D e c o r a t o r和P r o x y對(duì)象的接口與被修飾的對(duì)象和受委托的對(duì)象一致。而Vi s i t o r ( 5 . 11 )模式中,Vi s i t o r接口必須反映出v i s i t o r能訪問(wèn)的對(duì)象的所有類。27抽象類抽象類(abstract class)的主要目的是為它的子類定義公共接口。一個(gè)抽象類將把它的部分
23、或全部操作的實(shí)現(xiàn)延遲到子類中,因此,一個(gè)抽象類不能被實(shí)例化。在抽象類中定義卻沒(méi)有實(shí)現(xiàn)的操作被稱為抽象操作(abstract operation)。非抽象類稱為具體類(concrete class)。子類能夠改進(jìn)和重新定義它們父類的操作。更具體地說(shuō),類能夠重定義( o v e r r i d e )父類定義的操作,重定義使得子類能接管父類對(duì)請(qǐng)求的處理操作。類繼承允許你只需簡(jiǎn)單的擴(kuò)展其他類就可以定義新類,從而可以很容易地定義具有相近功能的對(duì)象族。28類繼承與接口繼承的比較理解對(duì)象的類( c l a s s )與對(duì)象的類型( t y p e -Java中的接口Interface)之間的差別非常重要。
24、一個(gè)對(duì)象的類定義了對(duì)象是怎樣實(shí)現(xiàn)的,同時(shí)也定義了對(duì)象的內(nèi)部狀態(tài)和操作的實(shí)現(xiàn)。但是對(duì)象的類型只與它的接口有關(guān),接口即對(duì)象能響應(yīng)的請(qǐng)求的集合。一個(gè)對(duì)象可以有多個(gè)類型,不同類的對(duì)象可以有相同的類型。當(dāng)然,對(duì)象的類和類型是有緊密關(guān)系的。因?yàn)轭惗x了對(duì)象所能執(zhí)行的操作,也定義了對(duì)象的類型。當(dāng)我們說(shuō)一個(gè)對(duì)象是一個(gè)類的實(shí)例時(shí),即指該對(duì)象支持類所定義的接口。29設(shè)計(jì)模式幫助描述對(duì)象的實(shí)現(xiàn)面向?qū)ο笤O(shè)計(jì)的第一個(gè)原則:針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程。不將變量聲明為某個(gè)特定的具體類的實(shí)例對(duì)象,而是讓它遵從抽象類所定義的接口。當(dāng)你不得不在系統(tǒng)的某個(gè)地方實(shí)例化具體的類(即指定一個(gè)特定的實(shí)現(xiàn))時(shí),創(chuàng)建型模式(Abstra
25、ct Factory(3.1),B u i l d e r ( 3 . 2 ),F(xiàn)actory Method(3.3),P r o t o t y p e ( 3 . 4 )和S i n g l e t o n ( 3 . 5 ) )可以幫你。通過(guò)抽象對(duì)象的創(chuàng)建過(guò)程,這些模式提供不同方式以在實(shí)例化時(shí)建立接口和實(shí)現(xiàn)的透明連接。創(chuàng)建型模式確保你的系統(tǒng)是采用針對(duì)接口的方式書(shū)寫的,而不是針對(duì)實(shí)現(xiàn)而書(shū)寫的。30運(yùn)用復(fù)用機(jī)制對(duì)象組合是類繼承之外的另一種復(fù)用選擇。新的更復(fù)雜的功能可以通過(guò)組裝或組合對(duì)象來(lái)獲得。對(duì)象組合要求被組合的對(duì)象具有良好定義的接口。這種復(fù)用風(fēng)格被稱為黑箱復(fù)用(black-box reus
26、e),因?yàn)閷?duì)象的內(nèi)部細(xì)節(jié)是不可見(jiàn)的。31繼承機(jī)制的優(yōu)缺點(diǎn)優(yōu)點(diǎn):類繼承是在編譯時(shí)刻靜態(tài)定義的,且可直接使用,因?yàn)槌绦蛟O(shè)計(jì)語(yǔ)言直接支持類繼承。類繼承可以較方便地改變被復(fù)用的實(shí)現(xiàn)。當(dāng)一個(gè)子類重定義一些而不是全部操作時(shí),它也能影響它所繼承的操作,只要在這些操作中調(diào)用了被重定義的操作。缺點(diǎn)因?yàn)槔^承在編譯時(shí)刻就定義了,所以無(wú)法在運(yùn)行時(shí)改變從父類繼承的實(shí)現(xiàn)。繼承常被認(rèn)為“破壞了封裝性” 。子類中的實(shí)現(xiàn)與它的父類有如此緊密的依賴關(guān)系,以至于父類實(shí)現(xiàn)中的任何變化必然會(huì)導(dǎo)致子類發(fā)生變化。如果繼承下來(lái)的實(shí)現(xiàn)不適合解決新的問(wèn)題,則父類必須重寫或被其他更適合的類替換。這種依賴關(guān)系限制了靈活性并最終限制了復(fù)用性。一個(gè)可用
27、的解決方法就是只繼承抽象類,因?yàn)槌橄箢愅ǔL峁┹^少的實(shí)現(xiàn)。32對(duì)象組合的優(yōu)點(diǎn)對(duì)象組合是通過(guò)獲得對(duì)其他對(duì)象的引用而在運(yùn)行時(shí)刻動(dòng)態(tài)定義的。組合要求對(duì)象遵守彼此的接口約定,進(jìn)而要求更仔細(xì)地定義接口,而這些接口并不妨礙你將一個(gè)對(duì)象和其他對(duì)象一起使用。這還會(huì)產(chǎn)生良好的結(jié)果:因?yàn)閷?duì)象只能通過(guò)接口訪問(wèn),所以我們并不破壞封裝性;只要類型一致,運(yùn)行時(shí)刻還可以用一個(gè)對(duì)象來(lái)替代另一個(gè)對(duì)象;更進(jìn)一步,因?yàn)閷?duì)象的實(shí)現(xiàn)是基于接口寫的,所以實(shí)現(xiàn)上存在較少的依賴關(guān)系。對(duì)象組合對(duì)系統(tǒng)設(shè)計(jì)還有另一個(gè)作用,即優(yōu)先使用對(duì)象組合有助于你保持每個(gè)類被封裝,并被集中在單個(gè)任務(wù)上。這樣類和類繼承層次會(huì)保持較小規(guī)模,并且不太可能增長(zhǎng)為不可控制
28、的龐然大物。另一方面,基于對(duì)象組合的設(shè)計(jì)會(huì)有更多的對(duì)象(而有較少的類),且系統(tǒng)的行為將依賴于對(duì)象間的關(guān)系而不是被定義在某個(gè)類中。33設(shè)計(jì)模式倡導(dǎo)對(duì)象組合的復(fù)用方式面向?qū)ο笤O(shè)計(jì)的第二個(gè)原則:優(yōu)先使用對(duì)象組合,而不是類繼承。理想情況下,你不應(yīng)為獲得復(fù)用而去創(chuàng)建新的構(gòu)件。你應(yīng)該能夠只使用對(duì)象組合技術(shù),通過(guò)組裝已有的構(gòu)件就能獲得你需要的功能。但是事實(shí)很少如此,因?yàn)榭捎脴?gòu)件的集合實(shí)際上并不足夠豐富。使用繼承的復(fù)用使得創(chuàng)建新的構(gòu)件要比組裝舊的構(gòu)件來(lái)得容易。這樣,繼承和對(duì)象組合常一起使用。經(jīng)驗(yàn)表明:設(shè)計(jì)者往往過(guò)度使用了繼承這種復(fù)用技術(shù)。但依賴于對(duì)象組合技術(shù)的設(shè)計(jì)卻有更好的復(fù)用性(或更簡(jiǎn)單)。設(shè)計(jì)模式中一再使
29、用對(duì)象組合技術(shù)。34怎樣選擇設(shè)計(jì)模式使用設(shè)計(jì)模式的最佳途徑將各種設(shè)計(jì)模式爛熟于心,在你進(jìn)行設(shè)計(jì)時(shí)識(shí)別在哪些地方能夠運(yùn)用這些設(shè)計(jì)模式。對(duì)于初學(xué)者來(lái)說(shuō),要找出一個(gè)針對(duì)特定設(shè)計(jì)問(wèn)題的模式可能還是很困難的,尤其是當(dāng)面對(duì)一組你還不怎么熟悉的新模式時(shí)。下面給出幾個(gè)不同的方法,幫助你發(fā)現(xiàn)適合你手頭問(wèn)題的設(shè)計(jì)模式:考慮設(shè)計(jì)模式是怎樣解決設(shè)計(jì)問(wèn)題的前面討論了設(shè)計(jì)模式怎樣幫助你找到合適的對(duì)象、決定對(duì)象的粒度、指定對(duì)象接口以及設(shè)計(jì)模式解決設(shè)計(jì)問(wèn)題的幾個(gè)其他方法。參考這些討論會(huì)有助于你找到合適的模式。瀏覽模式的意圖部分通讀每個(gè)模式的意圖,找出和你的問(wèn)題相關(guān)的一個(gè)或多個(gè)模式。你可以使用模式分類方法縮小你的搜查范圍。研究模式怎樣互相關(guān)聯(lián)圖1-1 以圖形方式顯示了設(shè)計(jì)模式之間的關(guān)系
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025河北建筑安全員-A證考試題庫(kù)附答案
- DB32T-食品安全督導(dǎo)工作規(guī)范編制說(shuō)明
- 三個(gè)共點(diǎn)力的動(dòng)態(tài)平衡
- 單位人力資源管理制度精彩大合集十篇
- 公用事業(yè)行業(yè)十二月行業(yè)動(dòng)態(tài)報(bào)告:水電發(fā)電量降幅收窄風(fēng)光核裝機(jī)目標(biāo)明確
- 江蘇省連云港市海州區(qū)2024-2025學(xué)年八年級(jí)上學(xué)期期末考試生物學(xué)試卷(含答案)
- 單位管理制度展示合集【職員管理篇】十篇
- 年產(chǎn)5000臺(tái)液晶電視項(xiàng)目可行性研究報(bào)告建議書(shū)
- 單位管理制度展示選集人力資源管理篇
- 單位管理制度品讀選集人員管理篇十篇
- 提高聚氯乙烯卷材地面一次驗(yàn)收合格率
- 【部編版】2022年語(yǔ)文七年級(jí)上:作文能力提升—謀篇布局(含答案)
- 甲型H1N1流感防治應(yīng)急演練方案(1)
- 稀土高鐵鋁合金電力電纜應(yīng)用參數(shù).
- 陳振明《公共管理學(xué)》(課堂PPT)
- 數(shù)據(jù)結(jié)構(gòu)-圖(1)
- LU和QR分解法解線性方程組
- 漏油器外殼的落料、拉深、沖孔級(jí)進(jìn)模的設(shè)計(jì)【畢業(yè)論文絕對(duì)精品】
- 工會(huì)會(huì)計(jì)報(bào)表完整版(內(nèi)有6張表)
- 【圖文】環(huán)保氣體絕緣環(huán)網(wǎng)柜
- 農(nóng)村體育教學(xué)資源的開(kāi)發(fā)運(yùn)用與拓展-精品文檔
評(píng)論
0/150
提交評(píng)論