- 相關(guān)推薦
設(shè)計(jì)模式課程設(shè)計(jì)報(bào)告
通過(guò)這次課程設(shè)計(jì)使我們都更加懂得并親身體會(huì)到了理論與實(shí)際相結(jié)合的重要性,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從實(shí)踐中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。以下是小編整理的設(shè)計(jì)模式課程設(shè)計(jì)報(bào)告,歡迎閱讀。
一、問(wèn)題要求及任務(wù)描述
設(shè)計(jì)模式課程作業(yè)要求獨(dú)立制作一個(gè)軟件,功能是實(shí)現(xiàn)23種模式的定義、優(yōu)缺點(diǎn)以及顯示示例代碼。
(一)、題目要求
設(shè)計(jì)軟件,將23種設(shè)計(jì)模式結(jié)合,要能夠顯示每種模式的定義、優(yōu)缺點(diǎn)以及舉例說(shuō)明例子,加上簡(jiǎn)單的代碼說(shuō)明。
(二)、主要任務(wù)
主要是選擇一種工具,實(shí)現(xiàn)顯示的功能,整理各種模式的定義,概念、使用情況、以及選擇模式實(shí)例,代碼實(shí)現(xiàn);
(三)、典型實(shí)例實(shí)現(xiàn)(任選三個(gè)分屬于不同設(shè)計(jì)模式的實(shí)例)
1、單例模式 定義與結(jié)構(gòu)
單例模式的意思就是只有一個(gè)實(shí)例。單例模式確保某一個(gè)類(lèi)只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。這個(gè)類(lèi)稱(chēng)為單例類(lèi)。 單例模式的要點(diǎn)
顯然單例模式的要點(diǎn)有三個(gè);一是某個(gè)類(lèi)只能有一個(gè)實(shí)例;二是它必須自行創(chuàng)建這個(gè)實(shí)例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。在下面的對(duì)象圖中,有一個(gè)單例對(duì)象,而客戶(hù)甲\、客戶(hù)乙和客戶(hù)丙\是單例對(duì)象的三個(gè)客戶(hù)對(duì)象。可以看到,所有的客戶(hù)對(duì)象共享一個(gè)單例對(duì)象。而且從單例對(duì)象到自身的連接線(xiàn)可以看出,單例對(duì)象持有對(duì)自己的引用。靜態(tài)變量(這是c/c++的叫法,其他語(yǔ)言或有不同)是實(shí)現(xiàn)單例模式的要素。 單例模式的2種方式:餓漢式,懶漢式
單例模式屬于對(duì)象創(chuàng)建型模式,其意圖是保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪(fǎng)問(wèn)它的全局訪(fǎng)問(wèn)點(diǎn)。對(duì)一些類(lèi)來(lái)說(shuō),只有一個(gè)實(shí)例是很重要的,雖然系統(tǒng)中可以有許多打印機(jī),但卻只應(yīng)該有一個(gè)打印機(jī)假脫機(jī),只應(yīng)該有一個(gè)文件系統(tǒng)和一個(gè)窗口管理器,一個(gè)數(shù)字濾波器只能有一個(gè)A/D轉(zhuǎn)換器,一個(gè)會(huì)計(jì)系統(tǒng)只能專(zhuān)用于一個(gè)公司。怎樣才能保證一個(gè)類(lèi)只有一個(gè)實(shí)例并且這個(gè)實(shí)例易于被訪(fǎng)問(wèn),一個(gè)全局變量使得一個(gè)對(duì)象可以被訪(fǎng)問(wèn),但它不能防止你實(shí)例化多個(gè)對(duì)象,一個(gè)更好的方法是讓類(lèi)自身負(fù)責(zé)保存他的唯一實(shí)例。這個(gè)類(lèi)可以保證沒(méi)有其他實(shí)例可以被創(chuàng)建,并且它可以提供一個(gè)訪(fǎng)問(wèn)該實(shí)例的方法,這就是Singleton模式。
一個(gè)產(chǎn)生隨機(jī)數(shù)的例子,整個(gè)應(yīng)用程序中只需要一個(gè)類(lèi)的實(shí)例來(lái)產(chǎn)生隨機(jī)數(shù),客戶(hù)端程序從類(lèi)中獲取這個(gè)實(shí)例,調(diào)用這個(gè)實(shí)例的方法nextInt(),公用的方法訪(fǎng)問(wèn)需要進(jìn)行同步,這是單例模式需要解決的同步問(wèn)題。
2、工廠方法模式 定義與結(jié)構(gòu)
工廠方法模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類(lèi)當(dāng)中。核心工廠類(lèi)不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,這樣核心類(lèi)成為一個(gè)抽象工廠角色,僅負(fù)責(zé)具體工廠子類(lèi)必須實(shí)現(xiàn)的接口,這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。
工廠方法模式是簡(jiǎn)單工廠模式的衍生,解決了許多簡(jiǎn)單工廠模式的問(wèn)題。首先完全實(shí)現(xiàn)‘開(kāi)-閉 原則’,實(shí)現(xiàn)了可擴(kuò)展。其次更復(fù)雜的層次結(jié)構(gòu),可以應(yīng)用于產(chǎn)品結(jié)果復(fù)雜的場(chǎng)合。
工廠方法模式的對(duì)簡(jiǎn)單工廠模式進(jìn)行了抽象。有一個(gè)抽象的Factory類(lèi)(可以是抽象類(lèi)和接口),這個(gè)類(lèi)將不在負(fù)責(zé)具體的產(chǎn)品生產(chǎn),而是只制定一些規(guī)范,具體的生產(chǎn)工作由其子類(lèi)去完成。在這個(gè)模式中,工廠類(lèi)和產(chǎn)品類(lèi)往往可以依次對(duì)應(yīng)。即一個(gè)抽象工廠對(duì)應(yīng)一個(gè)抽象產(chǎn)品,一個(gè)具體工廠對(duì)應(yīng)一個(gè)具體產(chǎn)品,這個(gè)具體的工廠就負(fù)責(zé)生產(chǎn)對(duì)應(yīng)的產(chǎn)品。
適用情況
第一種情況是對(duì)于某個(gè)產(chǎn)品,調(diào)用者清楚地知道應(yīng)該使用哪個(gè)具體工廠服務(wù),實(shí)例化該具體工廠,生產(chǎn)出具體的產(chǎn)品來(lái)。Java Collection中的iterator() 方法即屬于這種情況。
第二種情況,只是需要一種產(chǎn)品,而不想知道也不需要知道究竟是哪個(gè)工廠為生產(chǎn)的,即最終選用哪個(gè)具體工廠的決定權(quán)在生產(chǎn)者一方,它們根據(jù)當(dāng)前系統(tǒng)的情況來(lái)實(shí)例化一個(gè)具體的工廠返回給使用者,而這個(gè)決策過(guò)程這對(duì)于使用者來(lái)說(shuō)是透明的。 優(yōu)缺點(diǎn)
首先,良好的封裝性,代碼結(jié)構(gòu)清晰。一個(gè)對(duì)象創(chuàng)建是有條件約束的,如一個(gè)調(diào)用者需要一個(gè)具體的產(chǎn)品對(duì)象,只要知道這個(gè)產(chǎn)品的類(lèi)名(或約束字符串)就可以了,不用知道創(chuàng)建對(duì)象的艱辛過(guò)程,減少模塊間的耦合。
其次,工廠方法模式的擴(kuò)展性非常優(yōu)秀。在增加產(chǎn)品類(lèi)的情況下,只要適當(dāng)?shù)匦薷木唧w的工廠類(lèi)或擴(kuò)展一個(gè)工廠類(lèi),就可以完成“擁抱變化”。例如在我們的例子中,需要增加一個(gè)棕色人種,則只需要增加一個(gè)BrownHuman類(lèi),工廠類(lèi)不用任何修改就可完成系統(tǒng)擴(kuò)展。 再次,屏蔽產(chǎn)品類(lèi)。這一特點(diǎn)非常重要,產(chǎn)品類(lèi)的實(shí)現(xiàn)如何變化,調(diào)用者都不需要關(guān)心,它只需要關(guān)心產(chǎn)品的接口,只要接口保持不表,系統(tǒng)中的上層模塊就不要發(fā)生變化,因?yàn)楫a(chǎn)品類(lèi)的實(shí)例化工作是由工廠類(lèi)負(fù)責(zé),一個(gè)產(chǎn)品對(duì)象具體由哪一個(gè)產(chǎn)品生成是由工廠類(lèi)決定的。在數(shù)據(jù)庫(kù)開(kāi)發(fā)中,大家應(yīng)該能夠深刻體會(huì)到工廠方法模式的好處:如果使用JDBC連接數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)從MySql切換到Oracle,需要改動(dòng)地方就是切換一下驅(qū)動(dòng)名稱(chēng)(前提條件是SQL語(yǔ)句是標(biāo)準(zhǔn)語(yǔ)句),其他的都不需要修改,這是工廠方法模式靈活性的一個(gè)直接案。 最后,工廠方法模式是典型的解耦框架。高層模塊值需要知道產(chǎn)品的抽象類(lèi),其他的實(shí)現(xiàn)類(lèi)都不用關(guān)心,符合迪米特原則,我不需要的就不要去交流;也符合依賴(lài)倒轉(zhuǎn)原則,只依賴(lài)產(chǎn)品類(lèi)的抽象;當(dāng)然也符合里氏替換原則,使用產(chǎn)品子類(lèi)替換產(chǎn)品父類(lèi),沒(méi)問(wèn)題!
3、備忘錄模式
定義與結(jié)構(gòu)
備忘錄(Memento)模式又稱(chēng)標(biāo)記(Token)模式。GOF給備忘錄模式的定義為:在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。
從定義可以看出備忘錄模式是專(zhuān)門(mén)來(lái)存放對(duì)象歷史狀態(tài)的,這對(duì)于很好的實(shí)現(xiàn)undo、redo功能有很大的幫助。所以在命令模式中undo、redo功能可以配合備忘錄模式來(lái)實(shí)現(xiàn)。
適用情況
使用了備忘錄模式來(lái)實(shí)現(xiàn)保存對(duì)象的歷史狀態(tài)可以有效地保持封裝邊界。使用備忘錄可以避免暴露一些只應(yīng)由“備忘發(fā)起角色”管理卻又必須存儲(chǔ)在“備忘發(fā)起角色”之外的信息。把“備忘發(fā)起角色”內(nèi)部信息對(duì)其他對(duì)象屏蔽起來(lái), 從而保持了封裝邊界。
但是如果備份的“備忘發(fā)起角色”存在大量的信息或者創(chuàng)建、恢復(fù)操作非常頻繁,則可能造成很大的開(kāi)銷(xiāo)。
GOF在《設(shè)計(jì)模式》中總結(jié)了使用備忘錄模式的前提:
1) 必須保存一個(gè)對(duì)象在某一個(gè)時(shí)刻的(部分)狀態(tài), 這樣以后需要時(shí)它才能恢復(fù)到先前的狀態(tài)。
2) 如果一個(gè)用接口來(lái)讓其它對(duì)象直接得到這些狀態(tài),將會(huì)暴露對(duì)象的實(shí)現(xiàn)細(xì)節(jié)并破壞對(duì)象的封裝性。 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):使用備忘錄模式,可以避免暴露一些只應(yīng)由源發(fā)器管理卻又必須存儲(chǔ)在源發(fā)器之外的信息,而且能夠在對(duì)象需要時(shí)恢復(fù)到先前的狀態(tài)。
缺點(diǎn):使用備忘錄可能代價(jià)很高。如果源發(fā)器在生成備忘錄時(shí)必須復(fù)制并存儲(chǔ)大量的信息,或者客戶(hù)非常頻繁地創(chuàng)建備忘錄和恢復(fù)源發(fā)器狀態(tài),可能會(huì)導(dǎo)致非常大的開(kāi)銷(xiāo)。
1)備忘錄(Memento)角色:備忘錄角色存儲(chǔ)“備忘發(fā)起角色”的內(nèi)部狀態(tài)。“備忘發(fā)起角色”根據(jù)需要決定備忘錄角色存儲(chǔ)“備忘發(fā)起角色”的哪些內(nèi)部狀態(tài)。為了防止“備忘發(fā)起角色”以外的其他對(duì)象訪(fǎng)問(wèn)備忘錄。備忘錄實(shí)際上有兩個(gè)接口,“備忘錄管理者角色”只能看到備忘錄提供的窄接口——對(duì)于備忘錄角色中存放的屬性是不可見(jiàn)的。“備忘發(fā)起角色”則能夠看到一個(gè)寬接口——能夠得到自己放入備忘錄角色中屬性。
2)備忘發(fā)起(Originator)角色:“備忘發(fā)起角色”創(chuàng)建一個(gè)備忘錄,用以記錄當(dāng)前時(shí)刻它的內(nèi)部狀態(tài)。在需要時(shí)使用備忘錄恢復(fù)內(nèi)部狀態(tài)。
3)備忘錄管理者(Caretaker)角色:負(fù)責(zé)保存好備忘錄。不能對(duì)備忘錄的內(nèi)容進(jìn)行操作或檢查。
三、小結(jié)
(一)、問(wèn)題解決方法及程序?qū)崿F(xiàn)小結(jié)
我的課程設(shè)計(jì)作業(yè)用的是Dreamever,即靜態(tài)網(wǎng)頁(yè)。因?yàn)楸旧砻糠N模式的內(nèi)容相對(duì)固定,實(shí)例代碼以及uml圖片都不會(huì)有很大的變動(dòng),而且所有模式所涉及的數(shù)據(jù)內(nèi)容不多,不需要數(shù)據(jù)庫(kù)支持,所以用靜態(tài)網(wǎng)頁(yè)形式顯示既方便又合理。
在制作網(wǎng)頁(yè)的過(guò)程中,開(kāi)始的思路是運(yùn)用浮動(dòng)框架,但是因?yàn)槊糠N模式代碼普遍比較多,若顯示與框架之內(nèi),整個(gè)頁(yè)面布局不夠合理,也不美觀,于是,一種模式運(yùn)用兩個(gè)頁(yè)面來(lái)顯示,即合理又美觀。
但是軟件也有本身的缺陷,內(nèi)容相對(duì)固定,不易改變,在變動(dòng)后不容易改變。從每個(gè)頁(yè)面回歸前一個(gè)頁(yè)面的時(shí)候可能會(huì)不方便。
學(xué)習(xí)設(shè)計(jì)模式讓我們感覺(jué)程序設(shè)計(jì)實(shí)際上是一件很有意思的事情,23種設(shè)計(jì)模式,每種模式又有自己獨(dú)特的解決思路,帶有一定的通用性。我們?cè)诎l(fā)現(xiàn)問(wèn)題到解決問(wèn)題這個(gè)過(guò)程中,常會(huì)發(fā)現(xiàn)很多問(wèn)題是重復(fù)出現(xiàn)的,或是某個(gè)問(wèn)題的變體,外在不同,而本質(zhì)相同,這些問(wèn)題的本質(zhì)就是模式。設(shè)計(jì)模式主要是在大量變成的基礎(chǔ)上加以總結(jié),以減少重復(fù)編碼。
(二)、 尚未解決的問(wèn)題及下一步工作思路
對(duì)于模板方法模式的理解還不夠,相關(guān)內(nèi)容還沒(méi)有找到,對(duì)于課本上c#理解還不夠深入,應(yīng)該學(xué)習(xí)用多種語(yǔ)言實(shí)現(xiàn)每種模式,理解其基本思想。
(三)、 收獲
在本次課程設(shè)計(jì)中,加深了對(duì)于23種設(shè)計(jì)模式的理解和記憶,更加明白總結(jié)對(duì)于學(xué)習(xí)的重要性,在程序開(kāi)發(fā)中,重復(fù)性的東西是對(duì)于資源的一種浪費(fèi),所以在以后學(xué)習(xí)中應(yīng)該在更加注重總結(jié)學(xué)習(xí)。本次的課程設(shè)計(jì)作業(yè)也能作為以后學(xué)習(xí)的一個(gè)工具,在需要復(fù)習(xí)的時(shí)候,可以回來(lái)查閱總結(jié)的內(nèi)容,一舉兩得。
【設(shè)計(jì)模式課程設(shè)計(jì)報(bào)告】相關(guān)文章:
課程設(shè)計(jì)報(bào)告07-23
課程設(shè)計(jì)報(bào)告09-11
翻轉(zhuǎn)課堂模式應(yīng)用文寫(xiě)作課程設(shè)計(jì)探索論文07-03
關(guān)于系統(tǒng)的課程設(shè)計(jì)報(bào)告08-05
課程設(shè)計(jì)報(bào)告(15篇)03-28
機(jī)械設(shè)計(jì)基礎(chǔ)課程設(shè)計(jì)報(bào)告07-03
課程設(shè)計(jì)教學(xué)設(shè)計(jì)12-24