![軟件工程_面向?qū)ο笤O(shè)計(jì)原則及設(shè)計(jì)模式_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/11/2c8ee92e-e1ef-43ff-bedc-1903396afa21/2c8ee92e-e1ef-43ff-bedc-1903396afa211.gif)
![軟件工程_面向?qū)ο笤O(shè)計(jì)原則及設(shè)計(jì)模式_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/11/2c8ee92e-e1ef-43ff-bedc-1903396afa21/2c8ee92e-e1ef-43ff-bedc-1903396afa212.gif)
![軟件工程_面向?qū)ο笤O(shè)計(jì)原則及設(shè)計(jì)模式_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/11/2c8ee92e-e1ef-43ff-bedc-1903396afa21/2c8ee92e-e1ef-43ff-bedc-1903396afa213.gif)
![軟件工程_面向?qū)ο笤O(shè)計(jì)原則及設(shè)計(jì)模式_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/11/2c8ee92e-e1ef-43ff-bedc-1903396afa21/2c8ee92e-e1ef-43ff-bedc-1903396afa214.gif)
![軟件工程_面向?qū)ο笤O(shè)計(jì)原則及設(shè)計(jì)模式_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/11/2c8ee92e-e1ef-43ff-bedc-1903396afa21/2c8ee92e-e1ef-43ff-bedc-1903396afa215.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、-2-從問(wèn)題開(kāi)始!從問(wèn)題開(kāi)始!n長(zhǎng)方形與正方形長(zhǎng)方形與正方形n假如我們有一個(gè)類:長(zhǎng)方形(假如我們有一個(gè)類:長(zhǎng)方形(Rectangle)n我們需要一個(gè)新的類,正方形(我們需要一個(gè)新的類,正方形(Square)n問(wèn):可否直接繼承長(zhǎng)方形?問(wèn):可否直接繼承長(zhǎng)方形?-3-開(kāi)始設(shè)計(jì):正方形開(kāi)始設(shè)計(jì):正方形-4-設(shè)計(jì)方案正確嗎?設(shè)計(jì)方案正確嗎?-5-為什么會(huì)出現(xiàn)問(wèn)題?為什么會(huì)出現(xiàn)問(wèn)題?-6-面向?qū)ο蟮脑O(shè)計(jì)原則面向?qū)ο蟮脑O(shè)計(jì)原則n什么是面向?qū)ο笤O(shè)計(jì)原則?什么是面向?qū)ο笤O(shè)計(jì)原則?n面向?qū)ο笤O(shè)計(jì)原則有什么意義?面向?qū)ο笤O(shè)計(jì)原則有什么意義?n是指導(dǎo)面向?qū)ο笤O(shè)計(jì)的基本指導(dǎo)思想是指導(dǎo)面向?qū)ο笤O(shè)計(jì)的基本指導(dǎo)思想n是評(píng)價(jià)面
2、向?qū)ο笤O(shè)計(jì)的價(jià)值觀體系是評(píng)價(jià)面向?qū)ο笤O(shè)計(jì)的價(jià)值觀體系n是設(shè)計(jì)模式的出發(fā)點(diǎn)和歸宿是設(shè)計(jì)模式的出發(fā)點(diǎn)和歸宿-7-設(shè)計(jì)目標(biāo)設(shè)計(jì)目標(biāo)n設(shè)計(jì)目標(biāo)設(shè)計(jì)目標(biāo)n可擴(kuò)展性可擴(kuò)展性 (Extensibility)n靈活性靈活性 (Flexibility)n可插入性可插入性 (Pluggability)n-8-設(shè)計(jì)質(zhì)量:好的設(shè)計(jì)設(shè)計(jì)質(zhì)量:好的設(shè)計(jì)n什么是好的設(shè)計(jì)?什么是好的設(shè)計(jì)?n容易理解容易理解n容易修改和擴(kuò)展容易修改和擴(kuò)展n容易復(fù)用容易復(fù)用n容易實(shí)現(xiàn)與應(yīng)用容易實(shí)現(xiàn)與應(yīng)用n簡(jiǎn)單、緊湊、經(jīng)濟(jì)適用簡(jiǎn)單、緊湊、經(jīng)濟(jì)適用n讓人工作起來(lái)心情愉快的設(shè)計(jì)讓人工作起來(lái)心情愉快的設(shè)計(jì)-9-面向?qū)ο蟮幕驹O(shè)計(jì)原則面向?qū)ο蟮幕驹O(shè)計(jì)原
3、則nSRP:?jiǎn)我宦氊?zé)原則:?jiǎn)我宦氊?zé)原則nThe Single Responsibility PrinciplenOCP:開(kāi)放:開(kāi)放-封閉原則封閉原則nThe Open-Close PrinciplenLSP:Liskov替換原則替換原則nThe Liskov Substitution PrinciplenISP:接口隔離原則:接口隔離原則nThe Interface Segregation Principle nDIP:依賴倒置原則:依賴倒置原則nThe Dependency Inversion Principlen-10-SRPnSRP(The Single Responsibility P
4、rinciple, 單一職責(zé)原則)單一職責(zé)原則)n就一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因就一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因n有關(guān)類的職責(zé)分配問(wèn)題,是面向?qū)ο笤O(shè)計(jì)中最有關(guān)類的職責(zé)分配問(wèn)題,是面向?qū)ο笤O(shè)計(jì)中最重要的基本原則重要的基本原則“A critical, fundamental ability in OOA/D is to skillfully assign responsibility to software components.” Craig Larman-11-SRP本質(zhì)本質(zhì)nSRP體現(xiàn)了內(nèi)聚性(體現(xiàn)了內(nèi)聚性(Cohesion)n內(nèi)聚性:一個(gè)模塊的組成元素之間的功能相內(nèi)聚
5、性:一個(gè)模塊的組成元素之間的功能相關(guān)性關(guān)性n類的職責(zé)定義為類的職責(zé)定義為“變化的原因變化的原因”,每個(gè),每個(gè)職責(zé)都是變化的一個(gè)軸線;職責(zé)都是變化的一個(gè)軸線;n當(dāng)需求變化時(shí),該變化會(huì)反映為類的職責(zé)的當(dāng)需求變化時(shí),該變化會(huì)反映為類的職責(zé)的變化變化n如果一個(gè)類承擔(dān)了多于一個(gè)的職責(zé),那么引如果一個(gè)類承擔(dān)了多于一個(gè)的職責(zé),那么引起它變化的原因就會(huì)有多個(gè)起它變化的原因就會(huì)有多個(gè)-12-違反違反SRP的案例的案例Rectangle類可能會(huì)因?yàn)閮煞矫娴脑蚨兓河?jì)算幾類可能會(huì)因?yàn)閮煞矫娴脑蚨兓河?jì)算幾何方面的原因和用戶界面設(shè)計(jì)方面的原因。其中只一發(fā)何方面的原因和用戶界面設(shè)計(jì)方面的原因。其中只一發(fā)生變化之
6、后,必須修改生變化之后,必須修改Rectangle類,而這種修改則可類,而這種修改則可能導(dǎo)致另一個(gè)應(yīng)用程序出錯(cuò)能導(dǎo)致另一個(gè)應(yīng)用程序出錯(cuò)除此之外,違反除此之外,違反SRP還會(huì)帶來(lái)物理依賴的缺點(diǎn)。還會(huì)帶來(lái)物理依賴的缺點(diǎn)。-13-解決方案解決方案增加新的類,使得每個(gè)類僅有一個(gè)職責(zé)增加新的類,使得每個(gè)類僅有一個(gè)職責(zé)-14-單一職責(zé)原則單一職責(zé)原則l下面這個(gè)類的設(shè)計(jì)是否合理?-15-單一職責(zé)原則單一職責(zé)原則l這個(gè)類處理的事情太多l(xiāng)計(jì)算薪水l計(jì)算稅費(fèi)l在磁盤(pán)上讀寫(xiě)他們自己l如何將它們轉(zhuǎn)化成XML或逆向轉(zhuǎn)化l如何用不同的報(bào)表打印l這意味著:從SAX改為JDOM、將數(shù)據(jù)庫(kù)從Access變成Oracle、改變稅
7、費(fèi)報(bào)表的格式,都得改變Employee類-16-單一職責(zé)原則單一職責(zé)原則-17-LSPnLSP(The Liskov Substitution Principle, Liskov替換原則)替換原則) n“若對(duì)于類型若對(duì)于類型S的任一對(duì)象的任一對(duì)象o1,均有類型,均有類型T的對(duì)象的對(duì)象o2存在,使得在存在,使得在T定義的所有程序定義的所有程序P中,用中,用o1替換替換o2之之后,程序的行為不變,則后,程序的行為不變,則S是是T的子類型的子類型”n如果在任何情況下,子類(或子類型)或?qū)崿F(xiàn)類與如果在任何情況下,子類(或子類型)或?qū)崿F(xiàn)類與基類都是可以互換的,那么繼承的使用就是合適的?;惗际强梢曰Q的
8、,那么繼承的使用就是合適的。為了達(dá)到這一目標(biāo),為了達(dá)到這一目標(biāo),n“”-18-違背違背LSP原則原則-19-怎么辦?怎么辦?ABABC-20-抽象類與具體類抽象類與具體類具體類3具體類3抽象類1抽象類1抽象類2抽象類2具體類1具體類1抽象類3抽象類3具體類2具體類2-21-解決方案解決方案-22-IS-A關(guān)系的思考?關(guān)系的思考?n鴕鳥(niǎo)是鳥(niǎo)嗎?是鴕鳥(niǎo)是鳥(niǎo)嗎?是n鴕鳥(niǎo)有翅膀,鳥(niǎo)也有翅膀鴕鳥(niǎo)有翅膀,鳥(niǎo)也有翅膀n鴕鳥(niǎo)有喙,鳥(niǎo)也有喙鴕鳥(niǎo)有喙,鳥(niǎo)也有喙n但是但是n鳥(niǎo)鳥(niǎo).getFlySpeed()n鴕鳥(niǎo)鴕鳥(niǎo).getRunSpeed()n有著不同有著不同-23-IS-A關(guān)系的思考關(guān)系的思考(續(xù)續(xù))n對(duì)于動(dòng)物學(xué)
9、家對(duì)于動(dòng)物學(xué)家n只關(guān)心鳥(niǎo)的生理特征,對(duì)他們來(lái)說(shuō),鴕鳥(niǎo)就只關(guān)心鳥(niǎo)的生理特征,對(duì)他們來(lái)說(shuō),鴕鳥(niǎo)就是鳥(niǎo)是鳥(niǎo)n 對(duì)于養(yǎng)鳥(niǎo)人對(duì)于養(yǎng)鳥(niǎo)人n關(guān)心鳥(niǎo)的行為特征,鴕鳥(niǎo)不是鳥(niǎo)關(guān)心鳥(niǎo)的行為特征,鴕鳥(niǎo)不是鳥(niǎo)n 他們都正確他們都正確n考慮一個(gè)特定設(shè)計(jì)是否恰當(dāng)時(shí),不能完考慮一個(gè)特定設(shè)計(jì)是否恰當(dāng)時(shí),不能完全孤立地看這個(gè)解決方案,應(yīng)該根據(jù)設(shè)全孤立地看這個(gè)解決方案,應(yīng)該根據(jù)設(shè)計(jì)的使用者提出的合理假設(shè)來(lái)審視計(jì)的使用者提出的合理假設(shè)來(lái)審視-24-OCPnOCP(The Open-Close Principle, 開(kāi)放開(kāi)放-封閉原則)封閉原則)n軟件實(shí)體(類、模塊、函數(shù)等)應(yīng)該是可擴(kuò)軟件實(shí)體(類、模塊、函數(shù)等)應(yīng)該是可擴(kuò)展的,但是不
10、可修改的展的,但是不可修改的n特征:特征:n對(duì)于擴(kuò)展是開(kāi)放的(對(duì)于擴(kuò)展是開(kāi)放的(Open for extension)n模塊的行為可以擴(kuò)展,當(dāng)應(yīng)用的需求改變時(shí),可以對(duì)模模塊的行為可以擴(kuò)展,當(dāng)應(yīng)用的需求改變時(shí),可以對(duì)模塊進(jìn)行擴(kuò)展,以滿足新的需求塊進(jìn)行擴(kuò)展,以滿足新的需求n對(duì)于更改是封閉的(對(duì)于更改是封閉的(Closed for modification)n對(duì)模塊行為擴(kuò)展時(shí),不必改動(dòng)模塊的源代碼或二進(jìn)制代對(duì)模塊行為擴(kuò)展時(shí),不必改動(dòng)模塊的源代碼或二進(jìn)制代碼碼-25-OCP的關(guān)鍵在于抽象的關(guān)鍵在于抽象nOCP的關(guān)鍵在于抽象的關(guān)鍵在于抽象n抽象技術(shù):抽象技術(shù):abstract class, Interf
11、acen抽象預(yù)見(jiàn)了可能的所有擴(kuò)展(閉)抽象預(yù)見(jiàn)了可能的所有擴(kuò)展(閉)n由抽象可以隨時(shí)導(dǎo)出新的類(開(kāi))由抽象可以隨時(shí)導(dǎo)出新的類(開(kāi))ClientServerServerClient InterfaceClient-26-范例:手與門(mén)范例:手與門(mén)n如何在程序中模擬用手去開(kāi)門(mén)和關(guān)門(mén)?如何在程序中模擬用手去開(kāi)門(mén)和關(guān)門(mén)?n行為:行為:n開(kāi)門(mén)(開(kāi)門(mén)(open)n關(guān)門(mén)(關(guān)門(mén)(close)n判斷門(mén)的狀態(tài)(判斷門(mén)的狀態(tài)(isOpened)-27-設(shè)計(jì)實(shí)現(xiàn)設(shè)計(jì)實(shí)現(xiàn)-28-新的需求新的需求-29-解決新的需求:修改設(shè)計(jì)解決新的需求:修改設(shè)計(jì)-30-符合符合OCP的設(shè)計(jì)方案的設(shè)計(jì)方案-31-新的實(shí)現(xiàn)新的實(shí)現(xiàn)-32-新
12、的需求新的需求-33-關(guān)于關(guān)于OCPnOCP是是OOD中很多說(shuō)法的核心中很多說(shuō)法的核心n如果這個(gè)原則應(yīng)用得有效,應(yīng)用程序就會(huì)具如果這個(gè)原則應(yīng)用得有效,應(yīng)用程序就會(huì)具有更多的可維護(hù)性、可重用性以及可健壯性有更多的可維護(hù)性、可重用性以及可健壯性nLSP是是OCP成為可能的主要原則之一成為可能的主要原則之一n正是子類型的可替換性才使得使用基類類型正是子類型的可替換性才使得使用基類類型的模塊在無(wú)需修改的情況下就可以擴(kuò)展的模塊在無(wú)需修改的情況下就可以擴(kuò)展-34-ISPnISP( The Interface Segregation Principle,接口隔離原則),接口隔離原則)n客戶不應(yīng)該依賴他們不用
13、到的方法,只給每客戶不應(yīng)該依賴他們不用到的方法,只給每個(gè)客戶它所需要的接口個(gè)客戶它所需要的接口n為了避免為了避免“肥接口肥接口(fat interface)”,應(yīng)當(dāng),應(yīng)當(dāng)以一個(gè)類實(shí)現(xiàn)多個(gè)接口,而各客戶僅僅獲知以一個(gè)類實(shí)現(xiàn)多個(gè)接口,而各客戶僅僅獲知必須的接口必須的接口-35-接口污染接口污染n需求:一扇能超時(shí)報(bào)警的門(mén)需求:一扇能超時(shí)報(bào)警的門(mén)nDoornOpen()nClose()n當(dāng)需要其它的門(mén)時(shí)習(xí)慣性從當(dāng)需要其它的門(mén)時(shí)習(xí)慣性從Door中繼承中繼承n問(wèn)題在哪兒?問(wèn)題在哪兒?n所有的門(mén)都擁有所有的門(mén)都擁有timeout接口,即便它不需接口,即便它不需要要-36-解決方案:分離接口解決方案:分離接口
14、n使用委托分離接口使用委托分離接口nAdapter模式模式n使用多重繼承分離接口使用多重繼承分離接口-37-ISP本質(zhì)本質(zhì)n使用多個(gè)專門(mén)的接口比使用單一的接口使用多個(gè)專門(mén)的接口比使用單一的接口好好n一個(gè)類對(duì)另一個(gè)類的依賴性應(yīng)當(dāng)是建立一個(gè)類對(duì)另一個(gè)類的依賴性應(yīng)當(dāng)是建立在最小的接口上的在最小的接口上的n避免接口污染(避免接口污染(Interface Pollution)-38-DIPnDIP(依賴倒置原則,(依賴倒置原則,The Dependency Inversion Principle)n高層模塊不應(yīng)該依賴于低層模塊。二者都應(yīng)該依賴高層模塊不應(yīng)該依賴于低層模塊。二者都應(yīng)該依賴于抽象于抽象n抽象
15、不應(yīng)該依賴于細(xì)節(jié)。細(xì)節(jié)應(yīng)該依賴于抽象抽象不應(yīng)該依賴于細(xì)節(jié)。細(xì)節(jié)應(yīng)該依賴于抽象n針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程nBooch:所有結(jié)構(gòu)良好的面向?qū)ο蠹軜?gòu)都具有:所有結(jié)構(gòu)良好的面向?qū)ο蠹軜?gòu)都具有清晰的層次定義,每個(gè)層次通過(guò)一個(gè)定義良好清晰的層次定義,每個(gè)層次通過(guò)一個(gè)定義良好的、受控的接口向外提供了一組內(nèi)聚的服務(wù)的、受控的接口向外提供了一組內(nèi)聚的服務(wù)-39-傳統(tǒng)的依賴關(guān)系傳統(tǒng)的依賴關(guān)系依依賴賴的的方方向向高級(jí)商業(yè)邏輯中層模塊中層模塊中層模塊底層模塊底層模塊底層模塊底層模塊底層模塊-40-符合符合DIP的系統(tǒng)的系統(tǒng)依依賴賴的的方方向向依依賴賴的的方方向向高級(jí)商業(yè)邏輯抽象層抽
16、象層抽象層實(shí)現(xiàn)層實(shí)現(xiàn)層實(shí)現(xiàn)層實(shí)現(xiàn)層實(shí)現(xiàn)層-41-啟發(fā)式原則啟發(fā)式原則n“依賴于抽象依賴于抽象”程序中所有依賴關(guān)系程序中所有依賴關(guān)系都應(yīng)該終止于抽象類或者接口都應(yīng)該終止于抽象類或者接口n啟發(fā)式原則:?jiǎn)l(fā)式原則:n任何變量都不應(yīng)該擁有指向具體類的指針或任何變量都不應(yīng)該擁有指向具體類的指針或者引用者引用n任何類都不應(yīng)該從具體類派生任何類都不應(yīng)該從具體類派生n任何方法都不應(yīng)該改寫(xiě)其任何基類中已經(jīng)實(shí)任何方法都不應(yīng)該改寫(xiě)其任何基類中已經(jīng)實(shí)現(xiàn)的方法現(xiàn)的方法-42-總結(jié)總結(jié)n單一責(zé)任原則單一責(zé)任原則(SRP)n一個(gè)類只有一個(gè)引起變化的原因一個(gè)類只有一個(gè)引起變化的原因n“開(kāi)開(kāi)-閉閉”原則原則(OCP)n對(duì)可變性
17、封裝對(duì)可變性封裝n里氏替換原則里氏替換原則(LSP)n如何進(jìn)行繼承如何進(jìn)行繼承n依賴倒置原則依賴倒置原則(DIP)n針對(duì)接口編程針對(duì)接口編程n接口隔離原則接口隔離原則(ISP)n恰當(dāng)?shù)膭澐纸涌诤徒巧‘?dāng)?shù)膭澐纸涌诤徒巧?44-設(shè)計(jì)?設(shè)計(jì)?-45-設(shè)計(jì)模式?設(shè)計(jì)模式?-46-設(shè)計(jì)模式設(shè)計(jì)模式n什么是設(shè)計(jì)模式?什么是設(shè)計(jì)模式?n設(shè)計(jì)就是解決方案設(shè)計(jì)就是解決方案對(duì)對(duì)的解決的解決n如果某個(gè)解決方案對(duì)如果某個(gè)解決方案對(duì)都很有用都很有用n這時(shí)就把它總結(jié)出來(lái)這時(shí)就把它總結(jié)出來(lái)n這就產(chǎn)生了設(shè)計(jì)模式這就產(chǎn)生了設(shè)計(jì)模式-47-設(shè)計(jì)模式的基本要素設(shè)計(jì)模式的基本要素n1. 名稱:用于助記,形象表示這個(gè)模式名稱:用于助
18、記,形象表示這個(gè)模式n2. 問(wèn)題:這個(gè)模式可以解決什么問(wèn)題問(wèn)題:這個(gè)模式可以解決什么問(wèn)題n3. 解決方案:這個(gè)模式怎樣解決這個(gè)問(wèn)解決方案:這個(gè)模式怎樣解決這個(gè)問(wèn)題的步驟與方法題的步驟與方法n4. 效果:使用這個(gè)模式與不使用這個(gè)模效果:使用這個(gè)模式與不使用這個(gè)模式有什么區(qū)別,它有什么優(yōu)點(diǎn)和缺點(diǎn)式有什么區(qū)別,它有什么優(yōu)點(diǎn)和缺點(diǎn) -48-經(jīng)典設(shè)計(jì)模式:經(jīng)典設(shè)計(jì)模式:GoFFactory MethodAdapter_ClassInterpreterTemplate MethodAbstract FactoryBuilderPrototypeSingletonAdapter_ObjectBridgeCo
19、mpositeDecoratorFacadeFlyweightProxyChain of ResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor-49-設(shè)計(jì)模式舉例設(shè)計(jì)模式舉例nObserver模式模式nsingleton模式模式nFactory模式模式n-50-觀察者模式(觀察者模式(Observer)n觀察者模式定義了一個(gè)一對(duì)多的依賴關(guān)觀察者模式定義了一個(gè)一對(duì)多的依賴關(guān)系,讓一個(gè)或多個(gè)系,讓一個(gè)或多個(gè)觀察者對(duì)象觀察者對(duì)象監(jiān)察一個(gè)監(jiān)察一個(gè)主題對(duì)象主題對(duì)象。n這樣一個(gè)主題對(duì)象在狀態(tài)上的變化能夠這樣一個(gè)主題
20、對(duì)象在狀態(tài)上的變化能夠通知所有的依賴于此對(duì)象的那些觀察者通知所有的依賴于此對(duì)象的那些觀察者對(duì)象,使這些觀察者對(duì)象能夠自動(dòng)更新。對(duì)象,使這些觀察者對(duì)象能夠自動(dòng)更新。 -51-觀察者模式類圖觀察者模式類圖 -52-抽象主題(抽象主題(Subject)角色角色 n主題角色把所有的觀察者主題角色把所有的觀察者對(duì)象的引用保存在一個(gè)列對(duì)象的引用保存在一個(gè)列表里;每個(gè)主題都可以有表里;每個(gè)主題都可以有任何數(shù)量的觀察者。任何數(shù)量的觀察者。n主題提供一個(gè)接口可以加主題提供一個(gè)接口可以加上或撤銷觀察者對(duì)象;主上或撤銷觀察者對(duì)象;主題角色又叫做抽象被觀察題角色又叫做抽象被觀察者者(Observable)角色。角色。
21、 -53-具體主題(具體主題(ConcreteSubject)角色角色 n保存對(duì)具體觀察者保存對(duì)具體觀察者對(duì)象有用的內(nèi)部狀對(duì)象有用的內(nèi)部狀態(tài);態(tài);n在這種內(nèi)部狀態(tài)改在這種內(nèi)部狀態(tài)改變時(shí)給其觀察者發(fā)變時(shí)給其觀察者發(fā)出一個(gè)通知;出一個(gè)通知;n具體主題角色又叫具體主題角色又叫作具體被觀察者角作具體被觀察者角色;色; -54-具體觀察者(具體觀察者(ConcreteObserver)角色角色n保存一個(gè)指向具體保存一個(gè)指向具體主題對(duì)象的引用;主題對(duì)象的引用;n具體觀察者角色實(shí)具體觀察者角色實(shí)現(xiàn)抽象觀察者角色現(xiàn)抽象觀察者角色所要求的更新自己所要求的更新自己的接口,以便使本的接口,以便使本身的狀態(tài)與主題的身
22、的狀態(tài)與主題的狀態(tài)自恰。狀態(tài)自恰。-55-觀察者模式在觀察者模式在Java中中n從從AWT1.1AWT1.1開(kāi)始視窗系統(tǒng)的事件模型采用開(kāi)始視窗系統(tǒng)的事件模型采用觀察者模式,因此觀察者模式在觀察者模式,因此觀察者模式在JavaJava語(yǔ)語(yǔ)言里的地位較為重要。言里的地位較為重要。n在在JavaJava語(yǔ)言的語(yǔ)言的java.utiljava.util庫(kù)里面,提供了庫(kù)里面,提供了一個(gè)一個(gè)ObservableObservable類以及一個(gè)類以及一個(gè)ObserverObserver接接口,構(gòu)成口,構(gòu)成JavaJava語(yǔ)言對(duì)觀察者模式的支持。語(yǔ)言對(duì)觀察者模式的支持。 -56-Java觀察者模式類圖觀察者模式
23、類圖-57-Observable類類 n被觀察者類都是被觀察者類都是java.util.Observable類類的子類的子類 -58-Observer接口接口npackage java.util;public interface Observer /* 當(dāng)被觀察的對(duì)象發(fā)生變化時(shí),這個(gè)方法會(huì)被調(diào)用。當(dāng)被觀察的對(duì)象發(fā)生變化時(shí),這個(gè)方法會(huì)被調(diào)用。*/ void update(Observable o, Object arg);-59-舉例舉例import java.awt.*;import java.applet.*;import java.awt.event.*;public class MyFi
24、rstApplet extends AppletTextField field1;Button okButton;public void init() field1 = new TextField(20); okButton = new Button(“確定); this.add(field1); this.add(okButton); MyListener listener = new MyListener(); okButton.addActionListener(listener); class MyListener implements ActionListener public vo
25、id actionPerformed(ActionEvent e) String label = okButton.getLabel();field1.setText(label); 點(diǎn)擊按鈕-60-單態(tài)模式單態(tài)模式(singleton) n一個(gè)單態(tài)類只可有一個(gè)實(shí)例。這樣的類一個(gè)單態(tài)類只可有一個(gè)實(shí)例。這樣的類常用來(lái)進(jìn)行資源管理。常用來(lái)進(jìn)行資源管理。 n例如:很多軟件都有數(shù)據(jù)庫(kù),一般而言,例如:很多軟件都有數(shù)據(jù)庫(kù),一般而言, 整個(gè)軟件應(yīng)當(dāng)使用一個(gè)聯(lián)接通道,而不整個(gè)軟件應(yīng)當(dāng)使用一個(gè)聯(lián)接通道,而不是任意在需要時(shí)就新打開(kāi)一個(gè)聯(lián)接通道。是任意在需要時(shí)就新打開(kāi)一個(gè)聯(lián)接通道。 -61-單態(tài)類的特性單態(tài)類的特
26、性 n1、單態(tài)類只可有一個(gè)實(shí)例。、單態(tài)類只可有一個(gè)實(shí)例。 2、它必須自己創(chuàng)立自己這唯一的一個(gè)實(shí)例。、它必須自己創(chuàng)立自己這唯一的一個(gè)實(shí)例。 3、它必須給所有其它的類提供自己這一實(shí)例。、它必須給所有其它的類提供自己這一實(shí)例。 最后,單態(tài)類在理論和實(shí)踐上都并非限定最后,單態(tài)類在理論和實(shí)踐上都并非限定只能有只能有“一個(gè)一個(gè)”實(shí)例,而是很容易推廣到任意實(shí)例,而是很容易推廣到任意有限個(gè)實(shí)例的情況。有限個(gè)實(shí)例的情況。 -62-舉例舉例n使用一個(gè)使用一個(gè)Calendar回答回答“二月有多少天二月有多少天”等問(wèn)等問(wèn)題,而不是創(chuàng)建多個(gè)題,而不是創(chuàng)建多個(gè)Calendar對(duì)象。對(duì)象。-63-工廠模式(工廠模式(Fac
27、tory)n工廠模式就是專門(mén)負(fù)責(zé)將大量有工廠模式就是專門(mén)負(fù)責(zé)將大量有共同接口的類實(shí)例化,而且不必事先實(shí)例化,而且不必事先知道每次是要實(shí)例化哪一個(gè)類的模知道每次是要實(shí)例化哪一個(gè)類的模式。式。 n工廠模式有以下幾種形態(tài)工廠模式有以下幾種形態(tài): n簡(jiǎn)單工廠簡(jiǎn)單工廠(Simple Factory)模式模式n工廠方法工廠方法(Factory Method)模式模式n抽象工廠抽象工廠(Abstract Factory)模式模式-64-簡(jiǎn)單工廠簡(jiǎn)單工廠(Simple Factory)模式模式n比如說(shuō)比如說(shuō),你有一個(gè)描述你的后花園的系統(tǒng)你有一個(gè)描述你的后花園的系統(tǒng),在你在你的后花園里有各種的花的后花園里有各種
28、的花,但還沒(méi)有水果。你現(xiàn)但還沒(méi)有水果。你現(xiàn)在要往你的系統(tǒng)里引進(jìn)一些新的類在要往你的系統(tǒng)里引進(jìn)一些新的類,用來(lái)描述用來(lái)描述下列的水果下列的水果: 葡萄葡萄 Grapes 草莓草莓 Strawberry 蘋(píng)果蘋(píng)果 Apple -65-簡(jiǎn)單工廠簡(jiǎn)單工廠(Simple Factory)模式模式 -66-簡(jiǎn)單工廠簡(jiǎn)單工廠(Simple Factory)模式模式n作為小花果園的主人兼園丁作為小花果園的主人兼園丁,也是系統(tǒng)的也是系統(tǒng)的一部分一部分,自然要由一個(gè)合適的類來(lái)代表自然要由一個(gè)合適的類來(lái)代表,這這個(gè)類就是個(gè)類就是 FruitGardener類。類。 -67-園丁的工作園丁的工作(簡(jiǎn)單工廠簡(jiǎn)單工廠)n
29、FruitGardenerFruitGardener類會(huì)根據(jù)要求類會(huì)根據(jù)要求, ,創(chuàng)立出不同的水創(chuàng)立出不同的水果類果類, ,比如蘋(píng)果比如蘋(píng)果Apple,Apple,葡萄葡萄GrapeGrape或草莓或草莓StrawberryStrawberry的實(shí)例。的實(shí)例。n這里的園丁就如同一個(gè)可以創(chuàng)建水果產(chǎn)品的工廠一樣n如果接到不合法的要求如果接到不合法的要求, ,FruitGardenerFruitGardener類會(huì)給類會(huì)給出例外出例外BadFruitExceptionBadFruitException。 -68-豐收的果園(客戶端)豐收的果園(客戶端)n在使用時(shí),只須呼叫在使用時(shí),只須呼叫Fruit
30、Gardener的的factory()方方法即可法即可ntry FruitGardener gardener = new FruitGardener();FruitIF grape = gardener.factory(grape);FruitIF apple = gardener.factory(apple);FruitIF strawberry = gardener.factory(strawberry);.catch(BadFruitException e) . -69-小結(jié):小結(jié):簡(jiǎn)單工廠模式的定義簡(jiǎn)單工廠模式的定義n總而言之總而言之, ,簡(jiǎn)單工廠模式簡(jiǎn)單工廠模式就是由一個(gè)工廠類根據(jù)就
31、是由一個(gè)工廠類根據(jù)參數(shù)來(lái)決定創(chuàng)立出那一參數(shù)來(lái)決定創(chuàng)立出那一種產(chǎn)品類的實(shí)例。種產(chǎn)品類的實(shí)例。 -70-工廠方法模式工廠方法模式n工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象化工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象化和推廣。和推廣。n它比簡(jiǎn)單工廠模式聰明的地方在于它比簡(jiǎn)單工廠模式聰明的地方在于, 它不再作它不再作為一個(gè)具體的交通警察的面貌出現(xiàn)為一個(gè)具體的交通警察的面貌出現(xiàn),而是而是以交以交通警察局(工廠)的面貌出現(xiàn)。通警察局(工廠)的面貌出現(xiàn)。 具體的警察具體的警察成為工廠方法的執(zhí)行者成為工廠方法的執(zhí)行者。n工廠方法模式里工廠方法模式里不再只由一個(gè)工廠類決定哪一個(gè)產(chǎn)品類應(yīng)當(dāng)被實(shí)例化,這個(gè)決定被交給子類去
32、作。 -71-開(kāi)始種植蔬菜開(kāi)始種植蔬菜n我們準(zhǔn)備再次引進(jìn)蔬菜類植物,比如我們準(zhǔn)備再次引進(jìn)蔬菜類植物,比如: n西紅柿西紅柿 (Tomato) n土豆土豆 (Potato) n西芥蘭花西芥蘭花 (Broccoli) n蔬菜需要噴灑蔬菜需要噴灑(dust)殺蟲(chóng)劑殺蟲(chóng)劑(pesticide)除蟲(chóng)除蟲(chóng) -72-為什么需要工廠方法模式為什么需要工廠方法模式n簡(jiǎn)單工廠模式。簡(jiǎn)單工廠模式。FruitGardener掌握所有水果類的生殺大權(quán)。掌握所有水果類的生殺大權(quán)。 -73-為什么需要工廠方法模式為什么需要工廠方法模式n再設(shè)計(jì)一個(gè)專管蔬菜類植物的工廠類再設(shè)計(jì)一個(gè)專管蔬菜類植物的工廠類 ?n這樣做一個(gè)明顯的不
33、足點(diǎn)就是不夠一般化和抽象化。這樣做一個(gè)明顯的不足點(diǎn)就是不夠一般化和抽象化。n在在FruitGardenerFruitGardener和和VeggieGardenerVeggieGardener類之間明顯存在類之間明顯存在很多共同點(diǎn)很多共同點(diǎn), , 這些共同點(diǎn)應(yīng)當(dāng)抽出來(lái)一般化和框架化。這些共同點(diǎn)應(yīng)當(dāng)抽出來(lái)一般化和框架化。n這樣一來(lái)這樣一來(lái), ,如果后花園的主人決定再在園子里引進(jìn)些如果后花園的主人決定再在園子里引進(jìn)些樹(shù)木類植物時(shí)樹(shù)木類植物時(shí), , 我們有框架化的處理方法。我們有框架化的處理方法。-74-工廠方法模式的定義工廠方法模式的定義 -75-工廠方法模式的定義工廠方法模式的定義nConcre
34、teCreatorConcreteCreator 的的factory() factory() 方法返還的方法返還的數(shù)據(jù)類型是一個(gè)接口數(shù)據(jù)類型是一個(gè)接口 PlantIFPlantIF,而不是哪一而不是哪一個(gè)具體的產(chǎn)品類。個(gè)具體的產(chǎn)品類。n這種設(shè)計(jì)使得工廠類創(chuàng)立哪一個(gè)產(chǎn)品類的實(shí)這種設(shè)計(jì)使得工廠類創(chuàng)立哪一個(gè)產(chǎn)品類的實(shí)例細(xì)節(jié)完全封裝在工廠類內(nèi)部。例細(xì)節(jié)完全封裝在工廠類內(nèi)部。 n工廠方法模式又叫多形性工廠模式,顯然是工廠方法模式又叫多形性工廠模式,顯然是因?yàn)閷?shí)工廠類都有共同的接口,或者都有共因?yàn)閷?shí)工廠類都有共同的接口,或者都有共同的抽象父類。同的抽象父類。 -76-工廠方法模式在小花果園系統(tǒng)中的實(shí)現(xiàn)工廠
35、方法模式在小花果園系統(tǒng)中的實(shí)現(xiàn) -77-工廠方法模式在小花果園系統(tǒng)中的實(shí)現(xiàn)工廠方法模式在小花果園系統(tǒng)中的實(shí)現(xiàn)n取代了過(guò)去的全能角色的是一個(gè)抽象的取代了過(guò)去的全能角色的是一個(gè)抽象的園丁,這個(gè)角色規(guī)定出具體園丁角色需園丁,這個(gè)角色規(guī)定出具體園丁角色需要實(shí)現(xiàn)的具體職能,而真正負(fù)責(zé)作物管要實(shí)現(xiàn)的具體職能,而真正負(fù)責(zé)作物管理的則是各種作物的具體園丁角色。理的則是各種作物的具體園丁角色。-78-工廠方法模式在小花果園系統(tǒng)中的實(shí)現(xiàn)工廠方法模式在小花果園系統(tǒng)中的實(shí)現(xiàn)-79-抽象工廠模式抽象工廠模式n抽象工廠模式是所有形態(tài)的工廠模式中抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最具廣泛性的一種形態(tài)。最為抽象和最具廣泛性的一種形態(tài)。 n抽象工廠模式是工廠方法模式的進(jìn)一步抽象工廠模式是工廠方法模式的進(jìn)一步擴(kuò)廣化和抽象化擴(kuò)廣化和抽象化 -80-抽
溫馨提示
- 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年糖、加工糖及制糖副產(chǎn)品合作協(xié)議書(shū)
- 2025年三維多向整體編織物合作協(xié)議書(shū)
- 2025年五金采購(gòu)合同標(biāo)準(zhǔn)版本(2篇)
- 2025年買(mǎi)賣(mài)合同鴨飼料(2篇)
- 2025年產(chǎn)品供銷合同簡(jiǎn)單版(2篇)
- 2025年二手簡(jiǎn)裝房購(gòu)房協(xié)議樣本(三篇)
- 2025年二手房買(mǎi)賣(mài)交合同常用版(4篇)
- 2025年臨時(shí)勞務(wù)合同樣本(2篇)
- 2025年個(gè)人投資公司協(xié)議經(jīng)典版(三篇)
- 2025年交通事故現(xiàn)場(chǎng)協(xié)議書(shū)表(2篇)
- 風(fēng)神汽車4S店安全生產(chǎn)培訓(xùn)課件
- ICU患者的體位轉(zhuǎn)換與床旁運(yùn)動(dòng)訓(xùn)練
- 人教版四年級(jí)上冊(cè)豎式計(jì)算200題及答案
- 建設(shè)工程工作總結(jié)報(bào)告
- 脾破裂術(shù)后健康宣教課件
- 三廢環(huán)保管理培訓(xùn)
- 財(cái)務(wù)管控的間接成本
- 藏族唐卡藝術(shù)特色分析
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- QFD模板含計(jì)算公式計(jì)分標(biāo)準(zhǔn)說(shuō)明模板
- 醫(yī)院護(hù)理培訓(xùn)課件:《早產(chǎn)兒姿勢(shì)管理與擺位》
評(píng)論
0/150
提交評(píng)論