




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、課程設(shè)計報告1、 問題要求及任務(wù)描述 設(shè)計模式課程作業(yè)要求獨立制作一個軟件,功能是實現(xiàn)23種模式的定義、優(yōu)缺點以及顯示示例代碼。(1) 、題目要求 設(shè)計軟件,將23種設(shè)計模式結(jié)合,要能夠顯示每種模式的定義、優(yōu)缺點以及舉例說明例子,加上簡單的代碼說明。(二)、主要任務(wù)主要是選擇一種工具,實現(xiàn)顯示的功能,整理各種模式的定義,概念、使用情況、以及選擇模式實例,代碼實現(xiàn);(3) 、典型實例實現(xiàn)(任選三個分屬于不同設(shè)計模式的實例)1、單例模式定義與結(jié)構(gòu) 單例模式的意思就是只有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。這個類稱為單例類。單例模式的要點顯然單例模式的
2、要點有三個;一是某個類只能有一個實例;二是它必須自行創(chuàng)建這個實例;三是它必須自行向整個系統(tǒng)提供這個實例。在下面的對象圖中,有一個單例對象,而客戶甲、客戶乙 和客戶丙是單例對象的三個客戶對象??梢钥吹?,所有的客戶對象共享一個單例對象。而且從單例對象到自身的連接線可以看出,單例對象持有對自己的引用。靜態(tài)變量(這是c/c+的叫法,其他語言或有不同)是實現(xiàn)單例模式的要素。單例模式的2種方式:餓漢式,懶漢式單例模式屬于對象創(chuàng)建型模式,其意圖是保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。對一些類來說,只有一個實例是很重要的,雖然系統(tǒng)中可以有許多打印機,但卻只應(yīng)該有一個打印機假脫機,只應(yīng)該有一個文
3、件系統(tǒng)和一個窗口管理器,一個數(shù)字濾波器只能有一個A/D轉(zhuǎn)換器,一個會計系統(tǒng)只能專用于一個公司。怎樣才能保證一個類只有一個實例并且這個實例易于被訪問,一個全局變量使得一個對象可以被訪問,但它不能防止你實例化多個對象,一個更好的方法是讓類自身負責(zé)保存他的唯一實例。這個類可以保證沒有其他實例可以被創(chuàng)建,并且它可以提供一個訪問該實例的方法,這就是Singleton模式。UML圖:餓漢式,懶漢式class Singleton private static Singleton instance=new Singleton();private Singleton()static Singleton getI
4、nstance() return instance;懶漢式class Singleton private static Singleton instance=null;private Singleton()static Singleton getInstance() if(instance=null)instance=new Singleton();return instance;一個產(chǎn)生隨機數(shù)的例子,整個應(yīng)用程序中只需要一個類的實例來產(chǎn)生隨機數(shù),客戶端程序從類中獲取這個實例,調(diào)用這個實例的方法nextInt(),公用的方法訪問需要進行同步,這是單例模式需要解決的同步問題。public cla
5、ss Singletonprivate Singleton()generator = new Random();public void setSeed(int seed)generator.setSeed(seed);public int nextInt()return generator.nextInt();public static synchronized Singleton getInstance()if (instance = null) instance = new Singleton();return instance;private Random generator;priva
6、te static Singleton instance;客戶端調(diào)用的代碼:package singleton;public class Clientpublic static void main(String args)Singleton s1 = Singleton.getInstance();System.out.println(s1.toString();for(int i=0;i10;i+)Singleton s2 = Singleton.getInstance();System.out.println(The randomed number is +s2.toString();2、
7、 工廠方法模式定義與結(jié)構(gòu) 工廠方法模式的意義是定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將實際創(chuàng)建工作推遲到子類當(dāng)中。核心工廠類不再負責(zé)產(chǎn)品的創(chuàng)建,這樣核心類成為一個抽象工廠角色,僅負責(zé)具體工廠子類必須實現(xiàn)的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進新的產(chǎn)品。 工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先完全實現(xiàn)開閉 原則,實現(xiàn)了可擴展。其次更復(fù)雜的層次結(jié)構(gòu),可以應(yīng)用于產(chǎn)品結(jié)果復(fù)雜的場合。 工廠方法模式的對簡單工廠模式進行了抽象。有一個抽象的Factory類(可以是抽象類和接口),這個類將不在負責(zé)具體的產(chǎn)品生產(chǎn),而是只制定一些規(guī)范,具
8、體的生產(chǎn)工作由其子類去完成。在這個模式中,工廠類和產(chǎn)品類往往可以依次對應(yīng)。即一個抽象工廠對應(yīng)一個抽象產(chǎn)品,一個具體工廠對應(yīng)一個具體產(chǎn)品,這個具體的工廠就負責(zé)生產(chǎn)對應(yīng)的產(chǎn)品。適用情況 第一種情況是對于某個產(chǎn)品,調(diào)用者清楚地知道應(yīng)該使用哪個具體工廠服務(wù),實例化該具體工廠,生產(chǎn)出具體的產(chǎn)品來。Java Collection中的iterator() 方法即屬于這種情況。 第二種情況,只是需要一種產(chǎn)品,而不想知道也不需要知道究竟是哪個工廠為生產(chǎn)的,即最終選用哪個具體工廠的決定權(quán)在生產(chǎn)者一方,它們根據(jù)當(dāng)前系統(tǒng)的情況來實例化一個具體的工廠返回給使用者,而這個決策過程這對于使用者來說是透明的。優(yōu)缺點 首先,良
9、好的封裝性,代碼結(jié)構(gòu)清晰。一個對象創(chuàng)建是有條件約束的,如一個調(diào)用者需要一個具體的產(chǎn)品對象,只要知道這個產(chǎn)品的類名(或約束字符串)就可以了,不用知道創(chuàng)建對象的艱辛過程,減少模塊間的耦合。 其次,工廠方法模式的擴展性非常優(yōu)秀。在增加產(chǎn)品類的情況下,只要適當(dāng)?shù)匦薷木唧w的工廠類或擴展一個工廠類,就可以完成“擁抱變化”。例如在我們的例子中,需要增加一個棕色人種,則只需要增加一個BrownHuman類,工廠類不用任何修改就可完成系統(tǒng)擴展。 再次,屏蔽產(chǎn)品類。這一特點非常重要,產(chǎn)品類的實現(xiàn)如何變化,調(diào)用者都不需要關(guān)心,它只需要關(guān)心產(chǎn)品的接口,只要接口保持不表,系統(tǒng)中的上層模塊就不要發(fā)生變化,因為產(chǎn)品類的實例
10、化工作是由工廠類負責(zé),一個產(chǎn)品對象具體由哪一個產(chǎn)品生成是由工廠類決定的。在數(shù)據(jù)庫開發(fā)中,大家應(yīng)該能夠深刻體會到工廠方法模式的好處:如果使用JDBC連接數(shù)據(jù)庫,數(shù)據(jù)庫從MySql切換到Oracle,需要改動地方就是切換一下驅(qū)動名稱(前提條件是SQL語句是標準語句),其他的都不需要修改,這是工廠方法模式靈活性的一個直接案。 最后,工廠方法模式是典型的解耦框架。高層模塊值需要知道產(chǎn)品的抽象類,其他的實現(xiàn)類都不用關(guān)心,符合迪米特原則,我不需要的就不要去交流;也符合依賴倒轉(zhuǎn)原則,只依賴產(chǎn)品類的抽象;當(dāng)然也符合里氏替換原則,使用產(chǎn)品子類替換產(chǎn)品父類,沒問題!UML圖實例代碼源代碼1 / 產(chǎn)品 Plant接
11、口 2 3 public interface Plant 4 5 /具體產(chǎn)品PlantA,PlantB 6 7 public class PlantA implements Plant 8 9 public PlantA () 10 11 System.out.println(create PlantA !); 12 13 14 15 public void doSomething() 16 17 System.out.println( PlantA do something .); 18 19 20 21 22 23 public class PlantB implements Plant
12、24 25 public PlantB () 26 27 System.out.println(create PlantB !); 28 29 30 31 public void doSomething() 32 33 System.out.println( PlantB do something .); 34 35 36 37 38 39 / 產(chǎn)品 Fruit接口40 41 public interface Fruit 42 43 /具體產(chǎn)品FruitA,F(xiàn)ruitB 44 45 public class FruitA implements Fruit 46 47 public FruitA
13、() 48 49 System.out.println(create FruitA !); 50 51 52 53 public void doSomething() 54 55 System.out.println( FruitA do something .); 56 57 58 59 60 61 public class FruitB implements Fruit 62 63 public FruitB() 64 65 System.out.println(create FruitB !); 66 67 68 69 public void doSomething() 70 71 Sy
14、stem.out.println( FruitB do something .); 72 73 74 75 76 77 / 抽象工廠方法78 79 public interface AbstractFactory 80 81 public Plant createPlant(); 82 83 public Fruit createFruit() ; 84 85 86 87 /具體工廠方法88 89 public class FactoryA implements AbstractFactory 90 91 public Plant createPlant() 92 93 return new
15、PlantA(); 94 95 96 97 public Fruit createFruit() 98 99 return new FruitA(); 100 101 102 103 104 105 public class FactoryB implements AbstractFactory 106 107 public Plant createPlant() 108 109 return new PlantB(); 110 111 112 113 public Fruit createFruit() 114 115 return new FruitB(); 116 117 118 119
16、 3、備忘錄模式定義與結(jié)構(gòu) 備忘錄(Memento)模式又稱標記(Token)模式。GOF給備忘錄模式的定義為:在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。 從定義可以看出備忘錄模式是專門來存放對象歷史狀態(tài)的,這對于很好的實現(xiàn)undo、redo功能有很大的幫助。所以在命令模式中undo、redo功能可以配合備忘錄模式來實現(xiàn)。適用情況 使用了備忘錄模式來實現(xiàn)保存對象的歷史狀態(tài)可以有效地保持封裝邊界。使用備忘錄可以避免暴露一些只應(yīng)由“備忘發(fā)起角色”管理卻又必須存儲在“備忘發(fā)起角色”之外的信息。把“備忘發(fā)起角色”內(nèi)部信息對其他
17、對象屏蔽起來, 從而保持了封裝邊界。 但是如果備份的“備忘發(fā)起角色”存在大量的信息或者創(chuàng)建、恢復(fù)操作非常頻繁,則可能造成很大的開銷。GOF在設(shè)計模式中總結(jié)了使用備忘錄模式的前提:1) 必須保存一個對象在某一個時刻的(部分)狀態(tài), 這樣以后需要時它才能恢復(fù)到先前的狀態(tài)。2) 如果一個用接口來讓其它對象直接得到這些狀態(tài),將會暴露對象的實現(xiàn)細節(jié)并破壞對象的封裝性。優(yōu)缺點優(yōu)點:使用備忘錄模式,可以避免暴露一些只應(yīng)由源發(fā)器管理卻又必須存儲在源發(fā)器之外的信息,而且能夠在對象需要時恢復(fù)到先前的狀態(tài)。缺點:使用備忘錄可能代價很高。如果源發(fā)器在生成備忘錄時必須復(fù)制并存儲大量的信息,或者客戶非常頻繁地創(chuàng)建備忘錄和
18、恢復(fù)源發(fā)器狀態(tài),可能會導(dǎo)致非常大的開銷。UML圖 1)備忘錄(Memento)角色:備忘錄角色存儲“備忘發(fā)起角色”的內(nèi)部狀態(tài)。“備忘發(fā)起角色”根據(jù)需要決定備忘錄角色存儲“備忘發(fā)起角色”的哪些內(nèi)部狀態(tài)。為了防止“備忘發(fā)起角色”以外的其他對象訪問備忘錄。備忘錄實際上有兩個接口,“備忘錄管理者角色”只能看到備忘錄提供的窄接口對于備忘錄角色中存放的屬性是不可見的?!皞渫l(fā)起角色”則能夠看到一個寬接口能夠得到自己放入備忘錄角色中屬性。2)備忘發(fā)起(Originator)角色:“備忘發(fā)起角色”創(chuàng)建一個備忘錄,用以記錄當(dāng)前時刻它的內(nèi)部狀態(tài)。在需要時使用備忘錄恢復(fù)內(nèi)部狀態(tài)。 3)備忘錄管理者(Caretake
19、r)角色:負責(zé)保存好備忘錄。不能對備忘錄的內(nèi)容進行操作或檢查。實例代碼 class Originator /這個是要保存的狀態(tài)private int state= 90; /保持一個“備忘錄管理者角色”的對象private Caretaker c = new Caretaker(); /讀取備忘錄角色以恢復(fù)以前的狀態(tài)public void setMemento() Memento memento = (Memento)c.getMemento(); state = memento.getState(); System.out.println(the state is +state+ now);
20、 /創(chuàng)建一個備忘錄角色,并將當(dāng)前狀態(tài)屬性存入,托給“備忘錄管理者角色”存放。public void createMemento() c.saveMemento(new Memento(state); /this is other business methods. /they maybe modify the attribute state public void modifyState4Test(int m) state = m; System.out.println(the state is +state+ now); /作為私有內(nèi)部類的備忘錄角色,它實現(xiàn)了窄接口,可以看到在第二種方法中寬
21、接口已經(jīng)不再需要/注意:里面的屬性和方法都是私有的private class Memento implements MementoIF private int state ; private Memento(int state) this.state = state ; private int getState() return state; /測試代碼客戶程序public class TestInnerClass public static void main(String args) Originator o = new Originator(); o.createMemento(); o.modifyState4Test(80); o.setMemento(); /窄接口interface MementoIF /“備忘錄管理者角色”class Caretaker private MementoIF m ; public void saveMemento(MementoIF m
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于勝任力的注冊建造師繼續(xù)教育動態(tài)課程體系研究
- 初中英語閱讀理解解題技巧研究
- 微信小程序在閱讀分享領(lǐng)域中的應(yīng)用設(shè)計
- 天然小分子化合物Vibsanin+A聯(lián)合酪氨酸激酶抑制劑誘導(dǎo)急性髓系白血病細胞分化的作用與機制研究
- 一種病變聲帶CFVF修正模型及其參數(shù)反演研究
- 養(yǎng)心氏片對老年冠心病合并2型糖尿病患者的心臟康復(fù)的影響
- DB11T-建筑弱電工程施工及驗收規(guī)范編制說明
- 三年級信息技術(shù)上冊第二單元第11課海底世界圖片展教案冀教版
- 企業(yè)買賣中介合同范本
- 與甲方物業(yè)合同范例
- 市政供水管線保護專項施工方案
- 名詞性從句、定語從句、狀語從句高考真題+詳細解析
- 第單元 世界民族之聲(一)-《星星索》課件 湘教版初中音樂八年級下冊
- 2023年青島職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)模擬試題及答案解析
- 第一課《不經(jīng)歷風(fēng)雨怎能見彩虹》課件
- 高新技術(shù)企業(yè)自評表
- 中國十二生肖文化-英文版
- 國家開放大學(xué)《城市管理學(xué)》形考任務(wù)1-4試題及答案
- YY/T 1282-2022一次性使用靜脈留置針
- GB/T 17591-2006阻燃織物
評論
0/150
提交評論