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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

6、terfacePrototype voidsetSize(intx); voidprintSize(); / 一個(gè)具體類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(); /需要很多類似的對(duì)象進(jìn)行測(cè)試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 組合模式 將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示"部分-整體"的層次結(jié)構(gòu)。"Composite使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)*的使用具有一致性。" 適用性 1.你想表示對(duì)象的部分-整*層次結(jié)構(gòu)。 2.你希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象。 參與者 1.Component 為組合中的對(duì)象聲明接口。 在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有

9、接口的缺省行為。 聲明一個(gè)接口用于訪問(wèn)和管理Component的子組件。 (可選)在遞歸結(jié)構(gòu)中定義一個(gè)接口,用于訪問(wèn)一個(gè)父部件,并在合*的情況下實(shí)現(xiàn)它。 2.Leaf 在組合中表示葉節(jié)點(diǎn)對(duì)象,葉節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)。 在組合中定義節(jié)點(diǎn)對(duì)象的行為。 3.Compos*te 定義有子部件的*些部件的行為。 存儲(chǔ)子部件。 在Component接口中實(shí)現(xiàn)與子部件有*的操作。 4.Client 通過(guò)Component接*操縱組合部件的對(duì)象。 類圖 例子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;/程序員, 表示沒(méi)有下屬了 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;/項(xiàng)目助理, 表示沒(méi)有下屬了 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("項(xiàng)目經(jīng)理"); Emplo*er pa = new ProjectAssistant("項(xiàng)目助理"); Employer progra*mer1 = new Programmer("程序員一"); Employer progr

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

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

16、文件夾的時(shí)候,操作系統(tǒng)實(shí)現(xiàn)了對(duì)文件夾內(nèi)的所有文件和文件夾的復(fù)制,即實(shí)現(xiàn)了組合對(duì)象的整體復(fù)制,而不是一個(gè)空的文件夾;這和我們復(fù)制單個(gè)文件的體驗(yàn)是一致的。這便是組合模式的妙處。完整的模擬代碼如下: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(); /用于存儲(chǔ)文件夾下的文件夾或文件的信息 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ù)制操作實(shí)現(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("我的音樂(lè)"); /我的音樂(lè)文件夾 47 File music1 = new File("你是我的眼.mp3"); /音樂(lè)文件1 48 File music2 = new File

20、("Without You.mp3"); /音樂(lè)文件2 49 /確定樹(shù)形結(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 運(yùn)行結(jié)果如下:58 復(fù)制文件夾:我的資料 59 復(fù)制文件:Java編程思想.pdf 60 復(fù)制文件夾:我的音樂(lè) 61 復(fù)制文件:你是我的眼.mp3 復(fù)制文件:Without You.mp31.3

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

22、#160;適用性 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ì)象的封裝性。 參與者 1.Memento 備忘錄存儲(chǔ)原發(fā)器對(duì)象的內(nèi)部狀態(tài)。 2.Originator 原發(fā)器創(chuàng)建一個(gè)備忘錄,用以記錄當(dāng)前時(shí)刻*的內(nèi)部狀態(tài)。 使用備忘錄恢復(fù)內(nèi)部狀態(tài). 3.Caretaker 負(fù)責(zé)保存好備忘錄。 不能對(duì)備忘錄的內(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("開(kāi)會(huì)中"); C*retaker ctk = new Ca*etaker(); ctk.setMemento(org.createMemento();/將數(shù)據(jù)封裝在Caretaker or*.setState("睡覺(jué)中"); org.sh*wState();*/顯示 o

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

27、原系統(tǒng)是就能一鍵還原了.(3)如果一個(gè)對(duì)象需要保存狀態(tài)并可通過(guò)undo或rollback等操作恢復(fù)到以前的狀態(tài)時(shí),可以使用Memento模式。1)一個(gè)類需要保存它的對(duì)象的狀態(tài)(相當(dāng)于Originator角色)2)設(shè)計(jì)一個(gè)類,該類只是用來(lái)保存上述對(duì)象的狀態(tài)(相當(dāng)于Memento角色)3)需要的時(shí)候,Caretaker角色要求Originator返回一個(gè)Memento并加以保存4)undo或rollback操作時(shí),通過(guò)Caretaker保存的Memento恢復(fù)Originator對(duì)象的狀態(tài)Memento模式比較簡(jiǎn)單,我們只需要按照上面所介紹的步驟就可以實(shí)現(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. 本站所有資源如無(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論