Java3種模式帶例子_第1頁
Java3種模式帶例子_第2頁
Java3種模式帶例子_第3頁
Java3種模式帶例子_第4頁
Java3種模式帶例子_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、中間件技術(shù)原理與應(yīng)用課程Java設(shè)計模式學(xué) 院 數(shù)學(xué)計算機學(xué)院 專 業(yè) 軟件工程 年 級 2011級 學(xué)生學(xué)號 12011242707 學(xué)生姓名 蘇發(fā)瑞 Java設(shè)計模式目錄1. 設(shè)計模式21.1 創(chuàng)建型模式21.1.1 原型模式21.2 結(jié)構(gòu)型模式41.2.1 組合模式51.3 行為型模式91.3.1 備忘錄模式11141. 設(shè)計模式1.1 創(chuàng)建型模式AbstractFactory ( 抽象工廠 ) FactoryMethod ( 工廠方法 ) Singleton ( 單態(tài)模式 ) Builder ( 建造者模式 ) Protot*pe * 原型模式 ) 1.1.1 原型模式 用原型實例指定

2、創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。 適用性 1.當(dāng)一個系統(tǒng)應(yīng)該獨立于它的產(chǎn)品創(chuàng)*、構(gòu)成和表示時。 2.當(dāng)要實例化的類是在運行時刻指定時,例如,通過動態(tài)裝載。 3.為了避免創(chuàng)建一個與產(chǎn)品類層次平行的工廠*層次時。 4.當(dāng)一個類的實例只能有幾個不同狀態(tài)組合中的一種時。 建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實例化該類更方便一些。 參與者 1. Prototype 聲明一個克隆自身的接口。 2. ConcretePrototype 實現(xiàn)一個克隆自身的操作。 3. Client 讓一個原型克*自身從而創(chuàng)建一個新的對象。 類圖 例子

3、Prototype public class Prototype implements Cloneable private String name; public void setName(String name) = name; public String getName() return ; public Object clone() try return super.clone(); catch (Exception e) e.printStackTrace(); return null; ConcretePrototype publ*c class

4、 ConcretePrototype extend* Prototype public ConcretePrototype(String name) setName(name); Client public clas* Test public static void main(String args) Prototype pro = new ConcretePrototy*e("prototype"); Prototype pro2 = (Prototype)pro.clone(); *ystem.out.println(pro.getName()*; System.out

5、.println(pro2.getName(); result prototypeprototype小結(jié):原始模型模式:通過給出一個原型對象來指明所要創(chuàng)建的對象的類型,然后用復(fù)制這個原型對象的方法創(chuàng)建出更多同類型的對象。原始模型模式允許動態(tài)的增加或減少產(chǎn)品類,產(chǎn)品類不需要非得有任何事先確定的等級結(jié)構(gòu),原始模型模式適用于任何的等級結(jié)構(gòu)。缺點是每一個類都必須配備一個克隆方法。例如:(1)QQ聊天,別人向我們打招呼,我們點個托管,設(shè)置對面內(nèi)容,然后就自動回復(fù)了。(2)設(shè)立原始尺寸,然后就可以根據(jù)原型復(fù)制更多的出來,代碼如下:totype; /原型in

6、terfacePrototype voidsetSize(intx); voidprintSize(); / 一個具體類classAimplementsPrototype, Cloneable privateintsize; publicA(intx) this.size = x; Override publicvoidsetSize(intx) this.size = x; Override publicvoidprintSize() System.out.println("Size: "+ size); Override publicA clone()throwsClo

7、neNotSupportedException return(A)super.clone(); /需要很多類似的對象進(jìn)行測試publicclassPrototypeTest publicstaticvoidmain(String args)throwsCloneNotSupportedException A a =newA(1); for(inti =2; i <10; i+) Prototype temp = a.clone(); temp.setSize(i); temp.printSize(); 1.2 結(jié)構(gòu)型模式Adapter * 適配器模式 * Bridge ( 橋接模* )

8、Composite ( 組合模式 ) Decorator ( 裝*模式 ) Facade ( 外觀模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) 1.2.1 組合模式 將對象組合成樹形結(jié)構(gòu)以表示"部分-整體"的層次結(jié)構(gòu)。"Composite使得用戶對單個對象和組合對*的使用具有一致性。" 適用性 1.你想表示對象的部分-整*層次結(jié)構(gòu)。 2.你希望用戶忽略組合對象與單個對象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對象。 參與者 1.Component 為組合中的對象聲明接口。 在適當(dāng)?shù)那闆r下,實現(xiàn)所有類共有

9、接口的缺省行為。 聲明一個接口用于訪問和管理Component的子組件。 (可選)在遞歸結(jié)構(gòu)中定義一個接口,用于訪問一個父部件,并在合*的情況下實現(xiàn)它。 2.Leaf 在組合中表示葉節(jié)點對象,葉節(jié)點沒有子節(jié)點。 在組合中定義節(jié)點對象的行為。 3.Compos*te 定義有子部件的*些部件的行為。 存儲子部件。 在Component接口中實現(xiàn)與子部件有*的操作。 4.Client 通過Component接*操縱組合部件的對象。 類圖 例子Component p*blic abstract class Employer private String name; public v

10、oid setName(String name) = *ame; public String getName() return ; public abstract void add(Employer employer*; public abstract void delete(Employer employer); public List employers; public void printInfo*) System.out.println(name); *ublic List getE*ployers() return this.employers;

11、 Leaf public class Programmer extends Employer public Programmer(String name) setNam*(name); employers = null;/程序員, 表示沒有下屬了 public v*id add(Employer employer) public void delete(Employer employer) public class Pro*ectAssistant extends Employer public ProjectAss*stant(String name) setName(name); empl

12、oyers = *ull;/項目助理, 表示沒有下屬了 public void add(Employer employer) public void delet*(Employer employer) Composite public class Project*anager extends E*ployer public ProjectManager(String name) setName(name); employers = new A*rayList(); public void add(Employer employer) employers.add(employer); publi

13、c void delete(Emplo*er employer) employers.remove(employer); Clie*t publ*c class Test public st*tic void main(String args) Employer pm = new ProjectManager("項目經(jīng)理"); Emplo*er pa = new ProjectAssistant("項目助理"); Employer progra*mer1 = new Programmer("程序員一"); Employer progr

14、ammer2 = new Programmer("程序員二"); pm.add(pa);/為項目經(jīng)理添加項目助理 pm.add(programmer2);/*項目經(jīng)理*加程序員 List ems = pm.getEm*loyers(); for (Employer em : ems) System.out.println(em.getNam*(); *result 項目助理程序員二小結(jié):合成模式:合成模式將對象組織到樹結(jié)構(gòu)中,可以用來描述整體與部分的關(guān)系。合成模式就是一個處理對象的樹結(jié)構(gòu)的模式。合成模式把部分與整體的關(guān)系用樹結(jié)構(gòu)表示出來。合成模式使得客戶端把一個個單獨的成分

15、對象和由他們復(fù)合而成的合成對象同等看待。例如:(1)Mary過完輪到Sarly過生日,還是不要叫她自己挑了,不然這個月伙食費肯定玩完,拿出我去年在華山頂上照的照片,在背面寫上“最好的的禮物,就是愛你的Fita”,再到街上禮品店買了個像框(賣禮品的MM也很漂亮哦),再找隔壁搞美術(shù)設(shè)計的Mike設(shè)計了一個漂亮的盒子裝起來,我們都是Decorator,最終都在修飾我這個人呀,怎么樣,看懂了嗎?(2) 一美女,穿件時髦衣裳,留著時髦發(fā)型,帶著金銀首飾,腳踏著華麗的靴子,這樣一裝扮,就更加漂亮了。(3)可以通過一個統(tǒng)一的接口將文件和文件夾統(tǒng)一起來,對用戶提供一致的操作,屏蔽不同的復(fù)制實現(xiàn)過程。我們在復(fù)制

16、文件夾的時候,操作系統(tǒng)實現(xiàn)了對文件夾內(nèi)的所有文件和文件夾的復(fù)制,即實現(xiàn)了組合對象的整體復(fù)制,而不是一個空的文件夾;這和我們復(fù)制單個文件的體驗是一致的。這便是組合模式的妙處。完整的模擬代碼如下:1 package com.csufox.Composite; 2 3 import java.util.ArrayList; 4 5 interface Node 6 public void copy(); /定義統(tǒng)一的接口:復(fù)制 7 8 9 class Folder implements Node 10 private String folderName; 11 private ArrayList n

17、odeList =new ArrayList(); /用于存儲文件夾下的文件夾或文件的信息 12 13 public Folder(String folderName) 14 this.folderName = folderName; 15 16 17 public void add(Node node) /增加文件或文件夾 18 nodeList.add(node); 19 20 21 public void copy() /文件夾復(fù)制操作實現(xiàn)遞歸 22 System.out.println("復(fù)制文件夾:" + folderName); 23 for(int i=0;i

18、24 Node node = (Node)nodeList.get(i); 25 node.copy(); 26 27 28 29 30 class File implements Node 31 private String fileName; 32 33 public File(String fileName) 34 this.fileName = fileName; 35 36 37 public void copy() 38 System.out.println("復(fù)制文件:" + fileName); 39 40 41 42 public class Compos

19、ite 43 public static void main(String args) 44 Folder document = new Folder("我的資料"); /我的資料文件夾 45 File book = new File("Java編程思想.pdf"); /文檔文件 46 Folder music = new Folder("我的音樂"); /我的音樂文件夾 47 File music1 = new File("你是我的眼.mp3"); /音樂文件1 48 File music2 = new File

20、("Without You.mp3"); /音樂文件2 49 /確定樹形結(jié)構(gòu)關(guān)系 50 document.add(book); 51 document.add(music); 52 music.add(music1); 53 music.add(music2); 54 55 document.copy(); /復(fù)制“我的資料”文件夾,遞歸地復(fù)制了其下所有文件夾和文件。 56 57 運行結(jié)果如下:58 復(fù)制文件夾:我的資料 59 復(fù)制文件:Java編程思想.pdf 60 復(fù)制文件夾:我的音樂 61 復(fù)制文件:你是我的眼.mp3 復(fù)制文件:Without You.mp31.3

21、行為型模式Chain of Responsibility ( 責(zé)任鏈模式 ) Command ( 命令模式 ) Interpreter ( 解釋器模式 ) Iterator ( 迭代器*式 ) Mediator ( 中介者模式 ) Memento ( 備忘錄模式 ) Observer ( 觀察者模式 ) State ( 狀*模式 ) Strategy ( 策略模式 ) TemplateMethod ( 模板方法 ) Vis*tor ( 訪問者模式 ) 1.3.1 備忘錄模式 在不破壞封裝性*前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。&

22、#160;適用性 1.必須*存一個對象在某一個時刻的(部分)狀態(tài),這樣以后需要時它才能恢復(fù)到先前的狀態(tài)。 2.如果一個用接口來讓其它對象直接得到這些狀態(tài),將會暴露對象的實現(xiàn)細(xì)節(jié)并破壞對象的封裝性。 參與者 1.Memento 備忘錄存儲原發(fā)器對象的內(nèi)部狀態(tài)。 2.Originator 原發(fā)器創(chuàng)建一個備忘錄,用以記錄當(dāng)前時刻*的內(nèi)部狀態(tài)。 使用備忘錄恢復(fù)內(nèi)部狀態(tài). 3.Caretaker 負(fù)責(zé)保存好備忘錄。 不能對備忘錄的內(nèi)*進(jìn)行操作或檢查。 類圖 例子Memento public class Memento private String state; public

23、 Meme*to(String state) this.state = state; public String getState() *eturn state; public void setSt*te(String state) this.stat* = s*ate; Or*ginator public class Originator private String state; public String getState() return state; public void setState(String state) this.state = state; *ublic Memen

24、to createMemento() return new Memento(state); p*blic void setMemento(Memento meme*to) state = memento.ge*State(); p*blic void showState() System.out.println(state); Caretaker public class Caretaker p*ivate Memento memento; public Memento getMemento() return this.memento; public void setMemento(Memen

25、to memento) this.memento = memento; Test public class Test public static void main(String args) Originator org = *ew Originator(); org*setState("開會中"); C*retaker ctk = new Ca*etaker(); ctk.setMemento(org.createMemento();/將數(shù)據(jù)封裝在Caretaker or*.setState("睡覺中"); org.sh*wState();*/顯示 o

26、rg.setMemento(ctk.getMemento();/將數(shù)據(jù)重新導(dǎo)入 or*.showState(); result 睡覺中開會中小結(jié): 備忘錄模式:備忘錄對象是一個用來存儲另外一個對象內(nèi)部狀態(tài)的快照 的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態(tài)捉住,并外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態(tài)。例如: (1)同時跟幾個網(wǎng)友聊天時,一定要記清楚剛才跟網(wǎng)友說了些什么話,不然MM發(fā)現(xiàn)了會不高興的哦,幸虧我有個備忘錄,剛才與哪個網(wǎng)友說了什么話我都拷貝一份放到備忘錄里面保存,這樣可以隨時察看以前的記錄啦。(2) 計算機設(shè)置還原點,當(dāng)需要進(jìn)行還

27、原系統(tǒng)是就能一鍵還原了.(3)如果一個對象需要保存狀態(tài)并可通過undo或rollback等操作恢復(fù)到以前的狀態(tài)時,可以使用Memento模式。1)一個類需要保存它的對象的狀態(tài)(相當(dāng)于Originator角色)2)設(shè)計一個類,該類只是用來保存上述對象的狀態(tài)(相當(dāng)于Memento角色)3)需要的時候,Caretaker角色要求Originator返回一個Memento并加以保存4)undo或rollback操作時,通過Caretaker保存的Memento恢復(fù)Originator對象的狀態(tài)Memento模式比較簡單,我們只需要按照上面所介紹的步驟就可以實現(xiàn)Memento模式。例子代碼如下:public interface MementoIF / 保存Mementopublic class Caretaker private MementoIF m;public void saveMemento(MementoIF m) this.m = m;public MementoIF getMemento() return m;public class Originator / 這是要保存的狀態(tài)private int state = 90;private Caretaker c = new Caretaker(

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論