




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、中間件技術原理與應用課程Java設計模式學 院 數(shù)學計算機學院 專 業(yè) 軟件工程 年 級 2011級 學生學號 12011242707 學生姓名 蘇發(fā)瑞 Java設計模式目錄1. 設計模式21.1 創(chuàng)建型模式21.1.1 原型模式21.2 結構型模式41.2.1 組合模式51.3 行為型模式91.3.1 備忘錄模式11141. 設計模式1.1 創(chuàng)建型模式AbstractFactory ( 抽象工廠 ) FactoryMethod ( 工廠方法 ) Singleton ( 單態(tài)模式 ) Builder ( 建造者模式 ) Protot*pe * 原型模式 ) 1.1.1 原型模式 用原型實例指定
2、創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。 適用性 1.當一個系統(tǒng)應該獨立于它的產(chǎn)品創(chuàng)*、構成和表示時。 2.當要實例化的類是在運行時刻指定時,例如,通過動態(tài)裝載。 3.為了避免創(chuàng)建一個與產(chǎn)品類層次平行的工廠*層次時。 4.當一個類的實例只能有幾個不同狀態(tài)組合中的一種時。 建立相應數(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小結:原始模型模式:通過給出一個原型對象來指明所要創(chuàng)建的對象的類型,然后用復制這個原型對象的方法創(chuàng)建出更多同類型的對象。原始模型模式允許動態(tài)的增加或減少產(chǎn)品類,產(chǎn)品類不需要非得有任何事先確定的等級結構,原始模型模式適用于任何的等級結構。缺點是每一個類都必須配備一個克隆方法。例如:(1)QQ聊天,別人向我們打招呼,我們點個托管,設置對面內容,然后就自動回復了。(2)設立原始尺寸,然后就可以根據(jù)原型復制更多的出來,代碼如下: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(); /需要很多類似的對象進行測試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 結構型模式Adapter * 適配器模式 * Bridge ( 橋接模* )
8、Composite ( 組合模式 ) Decorator ( 裝*模式 ) Facade ( 外觀模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) 1.2.1 組合模式 將對象組合成樹形結構以表示"部分-整體"的層次結構。"Composite使得用戶對單個對象和組合對*的使用具有一致性。" 適用性 1.你想表示對象的部分-整*層次結構。 2.你希望用戶忽略組合對象與單個對象的不同,用戶將統(tǒng)一地使用組合結構中的所有對象。 參與者 1.Component 為組合中的對象聲明接口。 在適當?shù)那闆r下,實現(xiàn)所有類共有
9、接口的缺省行為。 聲明一個接口用于訪問和管理Component的子組件。 (可選)在遞歸結構中定義一個接口,用于訪問一個父部件,并在合*的情況下實現(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 項目助理程序員二小結:合成模式:合成模式將對象組織到樹結構中,可以用來描述整體與部分的關系。合成模式就是一個處理對象的樹結構的模式。合成模式把部分與整體的關系用樹結構表示出來。合成模式使得客戶端把一個個單獨的成分
15、對象和由他們復合而成的合成對象同等看待。例如:(1)Mary過完輪到Sarly過生日,還是不要叫她自己挑了,不然這個月伙食費肯定玩完,拿出我去年在華山頂上照的照片,在背面寫上“最好的的禮物,就是愛你的Fita”,再到街上禮品店買了個像框(賣禮品的MM也很漂亮哦),再找隔壁搞美術設計的Mike設計了一個漂亮的盒子裝起來,我們都是Decorator,最終都在修飾我這個人呀,怎么樣,看懂了嗎?(2) 一美女,穿件時髦衣裳,留著時髦發(fā)型,帶著金銀首飾,腳踏著華麗的靴子,這樣一裝扮,就更加漂亮了。(3)可以通過一個統(tǒng)一的接口將文件和文件夾統(tǒng)一起來,對用戶提供一致的操作,屏蔽不同的復制實現(xiàn)過程。我們在復制
16、文件夾的時候,操作系統(tǒng)實現(xiàn)了對文件夾內的所有文件和文件夾的復制,即實現(xiàn)了組合對象的整體復制,而不是一個空的文件夾;這和我們復制單個文件的體驗是一致的。這便是組合模式的妙處。完整的模擬代碼如下:1 package com.csufox.Composite; 2 3 import java.util.ArrayList; 4 5 interface Node 6 public void copy(); /定義統(tǒng)一的接口:復制 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() /文件夾復制操作實現(xiàn)遞歸 22 System.out.println("復制文件夾:" + 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("復制文件:" + 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 /確定樹形結構關系 50 document.add(book); 51 document.add(music); 52 music.add(music1); 53 music.add(music2); 54 55 document.copy(); /復制“我的資料”文件夾,遞歸地復制了其下所有文件夾和文件。 56 57 運行結果如下:58 復制文件夾:我的資料 59 復制文件:Java編程思想.pdf 60 復制文件夾:我的音樂 61 復制文件:你是我的眼.mp3 復制文件:Without You.mp31.3
21、行為型模式Chain of Responsibility ( 責任鏈模式 ) Command ( 命令模式 ) Interpreter ( 解釋器模式 ) Iterator ( 迭代器*式 ) Mediator ( 中介者模式 ) Memento ( 備忘錄模式 ) Observer ( 觀察者模式 ) State ( 狀*模式 ) Strategy ( 策略模式 ) TemplateMethod ( 模板方法 ) Vis*tor ( 訪問者模式 ) 1.3.1 備忘錄模式 在不破壞封裝性*前提下,捕獲一個對象的內部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復到原先保存的狀態(tài)。&
22、#160;適用性 1.必須*存一個對象在某一個時刻的(部分)狀態(tài),這樣以后需要時它才能恢復到先前的狀態(tài)。 2.如果一個用接口來讓其它對象直接得到這些狀態(tài),將會暴露對象的實現(xiàn)細節(jié)并破壞對象的封裝性。 參與者 1.Memento 備忘錄存儲原發(fā)器對象的內部狀態(tài)。 2.Originator 原發(fā)器創(chuàng)建一個備忘錄,用以記錄當前時刻*的內部狀態(tài)。 使用備忘錄恢復內部狀態(tài). 3.Caretaker 負責保存好備忘錄。 不能對備忘錄的內*進行操作或檢查。 類圖 例子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ù)重新導入 or*.showState(); result 睡覺中開會中小結: 備忘錄模式:備忘錄對象是一個用來存儲另外一個對象內部狀態(tài)的快照 的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態(tài)捉住,并外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態(tài)。例如: (1)同時跟幾個網(wǎng)友聊天時,一定要記清楚剛才跟網(wǎng)友說了些什么話,不然MM發(fā)現(xiàn)了會不高興的哦,幸虧我有個備忘錄,剛才與哪個網(wǎng)友說了什么話我都拷貝一份放到備忘錄里面保存,這樣可以隨時察看以前的記錄啦。(2) 計算機設置還原點,當需要進行還
27、原系統(tǒng)是就能一鍵還原了.(3)如果一個對象需要保存狀態(tài)并可通過undo或rollback等操作恢復到以前的狀態(tài)時,可以使用Memento模式。1)一個類需要保存它的對象的狀態(tài)(相當于Originator角色)2)設計一個類,該類只是用來保存上述對象的狀態(tài)(相當于Memento角色)3)需要的時候,Caretaker角色要求Originator返回一個Memento并加以保存4)undo或rollback操作時,通過Caretaker保存的Memento恢復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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 戶外探險策劃師筆試試題及答案
- 紡織品檢測工程師筆試試題及答案
- 2025年淮安市清江浦區(qū)招聘教師筆試考試試題【答案】
- 2025年非離子型纖維素醚項目發(fā)展計劃
- 工程造價暑期實習報告范文
- 項目部安全事故應急方案與預案
- 2025年氣體檢測監(jiān)控系統(tǒng)項目建議書
- 2025年立式加工中心合作協(xié)議書
- 醫(yī)療培訓中的混合學習模式與技術應用探討
- 數(shù)據(jù)分析在優(yōu)化教育機構工作流程中的應用
- 《植物生長與環(huán)境》課程標準(含課程思政)
- 鐵路行車組織(高職)全套教學課件
- 注塑標準成型條件表電子表格模板
- 道閘系統(tǒng)施工方案
- 配置管理與漏洞修復
- 新版中國復發(fā)難治性急性髓系白血病診療指南
- 汽車維修輪胎服務方案范本
- 保潔巡查記錄表
- 成事的時間管理
- 國開大學2023年01月22503《學前兒童健康教育活動指導》期末考試答案
- 建筑工地九牌一圖內容僅供參考模板
評論
0/150
提交評論