已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第四章,行為模式,課程目標(biāo),Observer模式 Iterator模式 Strategy模式 Template模式 Visitor模式 Chain of Responsibility模式 Command模式 其他模式,如Interpreter模式、Mediator模式等,體驗(yàn)項(xiàng)目,本章體驗(yàn)項(xiàng)目的主要功能是使用Command模式實(shí)現(xiàn)窗體中鼠標(biāo)畫圖功能,該程序主要由以下幾個(gè)部分組成:,程序運(yùn)行完成后,拖動(dòng)鼠標(biāo)在窗體上畫出“Hello”字符,(1)命令接口Command,定義命令方法。,(2)具體命令角色MacroCommand和DrawCommand類,這兩個(gè)類都實(shí)現(xiàn)Command接口,DrawCommand實(shí)現(xiàn)畫圖命令,MacroCommand類定義對(duì)命令的新增、執(zhí)行和刪除等方法。,(3)請(qǐng)求接口Drawable,DrawCanvas類實(shí)現(xiàn)Drawable接口,定義與具體請(qǐng)求相關(guān)的操作。,(4)客戶端,繼承JFrame并實(shí)現(xiàn)ActionListener和MouseMotionListener接口,創(chuàng)建窗體界面和各種事件,行為模式概述,行為模式涉及到算法和對(duì)象間職責(zé)的分配,行為模式描述了對(duì)象和類的模式,以及它們之間的通信模式,這些模式刻劃了在程序運(yùn)行時(shí)難以跟蹤的復(fù)雜的控制流。,可分為行為類模式和行為對(duì)象模式兩種:,(1)行為類模式使用繼承機(jī)制在類間分派行為。,(2)行為對(duì)象模式使用對(duì)象復(fù)合而不是繼承。一些行為對(duì)象模式描述了一組對(duì)等的對(duì)象怎樣相互協(xié)作以完成其中任何一個(gè)對(duì)象都無法單獨(dú)完成的任務(wù)。這里一個(gè)重要的問題是對(duì)等對(duì)象如何互相了解對(duì)方。對(duì)等對(duì)象可以保持顯式的對(duì)對(duì)方的引用,但那會(huì)增加它們的耦合度。在極端情況下,每一個(gè)對(duì)象都要了解所有其他的對(duì)象。,Chain of Responsibility模式,Chain of Responsibility模式即職責(zé)鏈模式,在有不止一個(gè)對(duì)象可以處理或?qū)崿F(xiàn)客戶請(qǐng)求的時(shí)候,責(zé)任鏈模式(CoR)會(huì)順序地給每一個(gè)對(duì)象一次處理請(qǐng)求的機(jī)會(huì)。一個(gè)較好的例子就是Java的異常處理機(jī)制,當(dāng)程序中發(fā)生異常時(shí),將會(huì)比較與catch所捕捉的異常是否相符合,如果符合就執(zhí)行所設(shè)定的處理,如果都沒有對(duì)比到適當(dāng)?shù)漠愄幚?,就?huì)將異常丟出try catch程序塊之外。,模式介紹,主要適用于以下情況:,有多個(gè)對(duì)象可以處理一個(gè)請(qǐng)求,但哪個(gè)對(duì)象來處理該請(qǐng)求是在運(yùn)行時(shí)刻自動(dòng)確定的。,想在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求。,希望動(dòng)態(tài)的指定處理某個(gè)請(qǐng)求的對(duì)象集合。,Chain of Responsibility模式結(jié)構(gòu)圖,職責(zé)鏈模式結(jié)構(gòu)圖如下:,Handler:定義一個(gè)處理請(qǐng)求的接口。,ConcreteHandler:處理它所負(fù)責(zé)的請(qǐng)求,并可訪問在該鏈中它的后繼者。如果可處理該請(qǐng)求,就處理;否則將該請(qǐng)求轉(zhuǎn)發(fā)給它的后繼者。,Client:向鏈上的具體處理者即ConcreteHandler對(duì)象提交請(qǐng)求。,Chain of Responsibility模式示例,public interface Handler public void handleRequest(char c); public class CharacterHandler implements Handler private Handler successor; public CharacterHandler(Handler successor) this.successor = successor; public void handleRequest(char c) if(Character.isLetter(c) System.out.println(“CharacterHandler類處理請(qǐng)求,返回結(jié)果:你輸入的是字元“); else successor.handleRequest(c); public class NumberHandler implements Handler private Handler successor; public NumberHandler(Handler successor) this.successor = successor; public void handleRequest(char c) if(Character.isDigit(c) System.out.println(“NumberHandler類處理請(qǐng)求,返回結(jié)果:你輸入的是數(shù)字“); else successor.handleRequest(c); public class SymbolHandler implements Handler public void handleRequest(char c) if (Character.isDefined(c) System.out.println(“SymbolHandler類處理請(qǐng)求,返回結(jié)果:你輸入的是符號(hào)“); else System.out.println(“請(qǐng)求未被處理“); ,處理字元,處理數(shù)字,處理符號(hào),職責(zé)鏈模式優(yōu)勢(shì)和不足,職責(zé)鏈模式主要有以下幾個(gè)優(yōu)點(diǎn):,降低耦合度,職責(zé)鏈模式不足:,效率低 ,一個(gè)請(qǐng)求的完成可能要遍歷到最后才可能完成。,擴(kuò)展性差,在該模式中,一定要有一個(gè)統(tǒng)一的Handler接口。,增強(qiáng)了給對(duì)象指派職責(zé)的靈活性,Command模式,Command模式即命令模式,該模式把一個(gè)請(qǐng)求或者操作封裝到一個(gè)對(duì)象中,并將發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開,委派給不同的對(duì)象。允許請(qǐng)求的一方和發(fā)送的一方獨(dú)立開來 。,模式介紹,主要適用于以下情況:,抽象出待執(zhí)行的動(dòng)作以參數(shù)化某對(duì)象,你可用過程語言中的回調(diào)(callback)函數(shù)表達(dá)這種參數(shù)化機(jī)制。,在不同的時(shí)刻指定、排列和執(zhí)行請(qǐng)求。一個(gè)Command對(duì)象可以有一個(gè)與初始請(qǐng)求無關(guān)的生存期。,支持取消操作。,支持修改日志。,用構(gòu)件在原語操作上的高層操作構(gòu)造一個(gè)系統(tǒng)。,Command模式結(jié)構(gòu)圖,命令模式結(jié)構(gòu)圖如下:,Command:聲明執(zhí)行操作的接口。,ConcreteCommand:將一個(gè)接收者對(duì)象綁定于一個(gè)動(dòng)作,調(diào)用接收者相應(yīng)的操作,以實(shí)現(xiàn)execute()方法。,Receiver:知道如何實(shí)施與執(zhí)行一個(gè)請(qǐng)求相關(guān)的操作,任何類都可能作為一個(gè)接收者。,Invoker:如果該命令可執(zhí)行,則要求該命令執(zhí)行這個(gè)請(qǐng)求,并存儲(chǔ)ConcreteCommand對(duì)象。,Client:創(chuàng)建一個(gè)具體命令對(duì)象并設(shè)定它的接收者。,Command模式示例,Command模式在界面設(shè)計(jì)中得到了廣泛的應(yīng)用,比如以下的示例:在窗體中添加四個(gè)按鈕和一個(gè)文本框,其中三個(gè)按鈕用于改變文本框的顏色,第四個(gè)按鈕用于關(guān)閉窗體。具體實(shí)現(xiàn)如下:,interface CommandInterface public void processEvent( ); import javax.swing.JButton; class Blue extends JButton implements CommandInterface public void processEvent( ) Client.tf1.setBackground(Color.BLUE); public Blue(String name) super(name); class buttonHandler implements ActionListener public void actionPerformed(ActionEvent e) CommandInterface CommandObj = (CommandInterface)e.getSource( ); CommandOcessEvent( ); ,自定義四個(gè)按鈕類,分別繼承JButton并實(shí)現(xiàn)CommandInterface接口。,Blue類改變文本框的顏色為“BLUE”, Cyan類改變文本框的顏色為“cyan”, Red類改變文本框的顏色為“red”, ExitButton類實(shí)現(xiàn)關(guān)閉窗體的操作。都很類似所以只給出了Blue類的參考代碼。,Command模式優(yōu)勢(shì)和不足,不足: 使用Command模式會(huì)導(dǎo)致系統(tǒng)有過多具體的 Command類。某些系統(tǒng)可能需要幾十個(gè),幾百個(gè)甚至幾千個(gè)具體Command類,這會(huì)使Command模式在這樣的系統(tǒng)里變得不實(shí)際。,Command模式將“進(jìn)行操作請(qǐng)求”的對(duì)象和“知道如何執(zhí)行操作”的對(duì)象分離開來。,多個(gè)command可以被組裝成一個(gè)復(fù)合command。,很容易增加新的command,因?yàn)椴恍枰薷默F(xiàn)有的類。,Command模式具有以下優(yōu)點(diǎn):,Command對(duì)象可以像任何其它對(duì)象一樣被使用和繼承。,Iterator模式,Iterator模式即迭代器模式,用于遍歷集合類的標(biāo)準(zhǔn)訪問方法。它可以把訪問邏輯從不同類型的集合類中抽象出來,從而避免向客戶端暴露集合的內(nèi)部結(jié)構(gòu),模式介紹,主要適用于以下情況:,訪問一個(gè)聚合對(duì)象的內(nèi)容而無需暴露它的內(nèi)部表示,多個(gè)對(duì)象聚在一起形成的總體稱之為聚合,聚合對(duì)象是能夠包容一組對(duì)象的容器對(duì)象。,支持對(duì)聚合對(duì)象的多種遍歷。,為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口(即支持多態(tài)迭代)。,Iterator模式結(jié)構(gòu)圖,迭代器模式結(jié)構(gòu)圖如下:,Iterator:定義訪問和遍歷元素的接口。,ConcreteIterator:實(shí)現(xiàn)了Iterator接口的具體迭代器,用于對(duì)聚合對(duì)象遍歷時(shí)跟蹤當(dāng)前的位置。,Aggregate:定義創(chuàng)建相應(yīng)迭代器的接口。,ConcreteAggregate:實(shí)現(xiàn)了Aggregate接口的聚合對(duì)象,實(shí)現(xiàn)了返回一個(gè)ConcreteIterator實(shí)例的方法。,Iterator模式示例,public interface MyIterator public boolean hasNext(); public Object next(); import java.util.List; public class ListIterator implements MyIterator private List list = null; private int index; public ListIterator(List l) index=-1; this.list=l; public boolean hasNext() return indexlist.size()-1; public Object next() +index; return list.get(index); import java.util.List; public interface MyList extends List public MyIterator getIterator( ); public MyIterator getReverseIterator( ); import java.util.Vector; public class MyVector extends Vector implements MyList public MyIterator getIterator() return new ListIterator(this); public MyIterator getReverseIterator() return new ReverseListIterator(this); ,Iterator模式優(yōu)勢(shì)和不足,使用迭代抽象:使得訪問一個(gè)聚合對(duì)象的內(nèi)容而無需暴露它的內(nèi)部表示。,提供迭代多態(tài):為遍歷不同的集合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上進(jìn)行操作。,主要缺點(diǎn)在與迭代器的健壯性問題:遍歷的同時(shí)更改迭代器所在的集合結(jié)構(gòu),會(huì)導(dǎo)致問題出現(xiàn)。,Iterator模式優(yōu)點(diǎn)和不足:,Observer模式,Observer模式實(shí)現(xiàn)了表示層和數(shù)據(jù)邏輯層的分離,使其允許獨(dú)立的改變目標(biāo)和觀察者。你可以單獨(dú)復(fù)用目標(biāo)對(duì)象而無需同時(shí)復(fù)用其觀察者,反之亦然。它也使你可以在不改動(dòng)目標(biāo)和其他觀察者的前提下增加觀察者。,模式介紹,主要適用于以下情況:,當(dāng)一個(gè)抽象模型存在兩個(gè)方面,其中一個(gè)方面依賴于另一方面,將這二者封裝在獨(dú)立的對(duì)象中以使它們可以各自獨(dú)立地改變和復(fù)用。,當(dāng)對(duì)一個(gè)對(duì)象的改變需要同時(shí)改變其它對(duì)象,而不知道具體有多少對(duì)象有待改變時(shí)。,當(dāng)一個(gè)對(duì)象必須通知其它對(duì)象,而它又不能假定其它對(duì)象是誰。也就是說你不希望這些對(duì)象是緊密耦合的。,Observer模式結(jié)構(gòu)圖,觀察者模式結(jié)構(gòu)圖如下:,Subject(目標(biāo)):提供注冊(cè)、刪除和通知觀察者對(duì)象的抽象類(或接口)。,Observer(觀察者):為那些在目標(biāo)發(fā)生改變時(shí)需要獲得通知的具體觀察者對(duì)象定義一個(gè)更新的接口。,ConcreteSubject(具體目標(biāo)):當(dāng)它的狀態(tài)發(fā)生變化時(shí),向它的各個(gè)觀察者發(fā)出通知。,ConcreteObserver(具體觀察者):實(shí)現(xiàn)Observer接口,維護(hù)一個(gè)ConcreteSubject對(duì)象,存儲(chǔ)有關(guān)狀態(tài),隨時(shí)更新這些狀態(tài)使得這些狀態(tài)與目標(biāo)的狀態(tài)一致。,Observer模式示例,使用Observer模式,根據(jù)取得的隨機(jī)數(shù)來打印不同個(gè)數(shù)的“*”和“”,具體實(shí)現(xiàn)如下 :,interface Observer public abstract void update(NumberObject object); class DigitObserver implements Observer public void update(NumberObject object) System.out.print(“DigitObserver:“); int count = object.getNumber(); for (int i = 0; i count; i+) System.out.print(“); System.out.println( ); try Thread.sleep(100); catch (InterruptedException e) System.out.println(e); ,DigitObserver類根據(jù)目標(biāo)對(duì)象的隨機(jī)數(shù),來打印該隨機(jī)數(shù)個(gè)數(shù)的“”。 GraphObserver類根據(jù)目標(biāo)對(duì)象的隨機(jī)數(shù),來打印該隨機(jī)數(shù)個(gè)數(shù)的“*”。 DigitObserver類和GraphObserver類的實(shí)現(xiàn)過程類似,,import java.util.*; abstract class NumberObject /儲(chǔ)存Observer private Vector observers = new Vector( ); /新增Observer public void addObserver(Observer observer) observers.add(observer); /刪除Observer public void deleteObserver(Observer observer) observers.remove(observer); /通知Observer public void notifyObservers( ) Iterator it = observers.iterator( ); while (it.hasNext() Observer o = (Observer) it.next( ); o.update(this); /取得數(shù)值 public abstract int getNumber( ); /產(chǎn)生數(shù)值 public abstract void execute( ); class RandomNumberObject extends NumberObject private Random random = new Random( ); / 隨機(jī)數(shù)生成器 private int number; public int getNumber( ) / 取得數(shù)值 return number; public void execute() for (int i = 0; i 10; i+) number = random.nextInt(30); notifyObservers(); /通知Observer ,Observer模式優(yōu)勢(shì)和不足,該設(shè)計(jì)模式的優(yōu)點(diǎn)主要體現(xiàn)在:目標(biāo)和觀察者間的抽象耦合。,因?yàn)橐粋€(gè)觀察者并不知道其它觀察者的存在,它可能對(duì)改變目標(biāo)的最終代價(jià)一無所知。在目標(biāo)上一個(gè)看似無誤的操作可能會(huì)引起一系列對(duì)觀察者以及依賴于這些觀察者的那些對(duì)象的更新。另外,如果依賴準(zhǔn)則的定義或維護(hù)不當(dāng),也常常會(huì)引起錯(cuò)誤的更新,而這種錯(cuò)誤通常很難捕捉。,該設(shè)計(jì)模式的缺點(diǎn)主要體現(xiàn)在:意外的更新可能會(huì)導(dǎo)致錯(cuò)誤。,一個(gè)目標(biāo)所知道的僅僅是它有一系列觀察者,并不知道任何一個(gè)觀察者屬于哪一個(gè)具體的類。這樣目標(biāo)和觀察者之間的耦合是抽象的和最小的。因?yàn)槟繕?biāo)和觀察者不是緊密耦合的,它們可以屬于一個(gè)系統(tǒng)中的不同抽象層次。一個(gè)處于較低層次的目標(biāo)對(duì)象可與一個(gè)處于較高層次的觀察者通信并通知它,這樣就保持了系統(tǒng)層次的完整性。,Strategy模式,Strategy模式使得算法與算法的使用者相分離,同時(shí)減少了二者間的耦合度,使得算法可獨(dú)立于使用它的客戶而變化;同時(shí),由于設(shè)計(jì)粒度的減小,程序的復(fù)用性也得到了進(jìn)一步提高,分離出來的算法可以更好地適應(yīng)復(fù)用的需要。,模式介紹,主要適用于以下情況:,如果在一個(gè)系統(tǒng)中有許多類,它們之間的區(qū)別僅在于它們的行為.,一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。,一個(gè)系統(tǒng)的算法使用的數(shù)據(jù)不可以讓客戶端知道.,如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)。,Strategy模式結(jié)構(gòu)圖,策略模式結(jié)構(gòu)圖如下:,Strategy(抽象策略):這是一個(gè)抽象角色,通常由一個(gè)接口或抽象類實(shí)現(xiàn)。并給出所有的具體策略類所需的接口。,Context(環(huán)境):維護(hù)一個(gè)Strategy類的對(duì)象,并定義一個(gè)方法供Strategy對(duì)象來訪問它的數(shù)據(jù)。,ConcreteStrategy(具體策略):包裝了相關(guān)的算法或行為。,Strategy模式示例,abstract class Compositor public abstract int compute(int a ); class MaxCompositor extends Compositor public int compute(int a ) int t; for(int i=0;iai+1) t=ai;ai=ai+1;ai+1=t; return aa.length-1; class CompositorSolve Compositor compositor; public CompositorSolve(Compositor compositor) positor = compositor; public void result(int a ) System.out.println(pute(a); public void setCompositor(Compositor compositor) positor=compositor; public class Client public static void main(String args) int a =10,45,20,10; CompositorSolve cs = new CompositorSolve(new MaxCompositor(); cs.result(a); cs.setCompositor(new MinCompositor(); cs.result(a); ,MaxCompositor封裝用于獲取數(shù)組最大值的方法,MinCompositor封裝用于獲取數(shù)組最小值的方法,實(shí)現(xiàn)過程類似。,Strategy模式優(yōu)勢(shì)和不足,策略模式的優(yōu)點(diǎn)主要體現(xiàn)在以下幾點(diǎn):,策略模式提供了管理相關(guān)的算法族的辦法,策略類的等級(jí)結(jié)構(gòu)定義了一個(gè)算法或行為族。避免了重復(fù)的代碼。,使用策略模式可以避免使用多重條件語句。,Facade模式不足,客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時(shí)選擇恰當(dāng)?shù)乃惴?。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。,策略模式提供了可以替換繼承關(guān)系的辦法,從而把算法或行為的使用者和算法或行為本身分隔開。,Template Method模式,模板方法模式基本原理是:準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體方法以及具體構(gòu)造子類的形式實(shí)現(xiàn),然后聲明一些抽象方法來迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)。,模式介紹,該模式主要適用于以下幾種情況:,一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類來實(shí)現(xiàn)。,各子類中公共的行為應(yīng)被提取出來并集中到一個(gè)公共父類中以避免代碼重復(fù)。,控制子類擴(kuò)展。模板方法只在特定點(diǎn)調(diào)用“鉤子操作”(提供缺省的方法,子類可以在必要時(shí)進(jìn)行擴(kuò)展),這樣就只允許在這些點(diǎn)進(jìn)行擴(kuò)展。,Template Method模式結(jié)構(gòu)圖,模板方法模式結(jié)構(gòu)圖如下:,AbstractClass(抽象類):定義一些抽象的原語操作,具體的子類重定義它們以實(shí)現(xiàn)一個(gè)算法步驟。,ConcreteClass(具體類):繼承AbstractClass類,并實(shí)現(xiàn)AbstractClass中的抽象方法以完成算法中與特定子類相關(guān)的步驟。,Template Method模式示例,public abstract class AbstractRead protected String resource; public void getContent() if(open() readContent(); close(); protected abstract boolean open( ); protected abstract void readContent( ); protected abstract void close( ); public class ReadHtml extends AbstractRead private URLConnection conn; private BufferedReader in; public ReadHtml(String url) resource = url; public boolean open( ) try URL url = new URL(resource); conn = url.openConnection( ); in = new BufferedReader(new InputStreamReader(conn.getInputStream( ); catch (Exception e) System.out.println(“文件打開失敗“); return false; return true; protected void readContent( ) try if(in != null) String str; while(str = in.readLine( ) != null) System.out.println(str); catch(IOException e) System.out.println(“文件讀取失敗“); protected void close( ) if(in != null) try in.close(); catch(IOException e) System.out.println(“IO 出錯(cuò)“); ,ReadHtml類封裝讀URL文件的具體實(shí)現(xiàn),ReadFile類封裝讀本地文件的具體實(shí)現(xiàn)。實(shí)現(xiàn)過程類似。,Template Method模式優(yōu)勢(shì)和不足,Template Method模式獲得一種反向控制結(jié)構(gòu)的效果,這也是面向?qū)ο笙到y(tǒng)的分析和設(shè)計(jì)中一個(gè)原則依賴倒置(Dependency Inversion Principles)。其含義就是父類調(diào)用子類的操作(高層模塊調(diào)用低層模塊的操作),低層模塊實(shí)現(xiàn)高層模塊聲明的接口。這樣控制權(quán)在父類(高層模塊),低層模塊反而要依賴高層模塊。,繼承的強(qiáng)制性約束關(guān)系也讓Template Method模式有不足的地方,我們可以看到對(duì)于各個(gè)ConcreteClass類中實(shí)現(xiàn)的方法,是不能被別的類復(fù)用的。,Visitor模式,Visitor模式即訪問者模式,該模式的定義:作用于某個(gè)對(duì)象群中各個(gè)對(duì)象的操作,它可以使你在不改變這些對(duì)象本身的情況下,定義作用于這些對(duì)象上的新操作。,模式介紹,該模式主要適用于以下幾種情況:,當(dāng)該對(duì)象結(jié)構(gòu)被很多應(yīng)用共享時(shí)。,一個(gè)對(duì)象結(jié)構(gòu)包含很多類對(duì)象,它們有不同的接口,而想對(duì)這些對(duì)象實(shí)施一些依賴于其具體類的操作。,需要對(duì)一個(gè)對(duì)象結(jié)構(gòu)中的對(duì)象進(jìn)行很多不同的并且不相關(guān)的操作,定義對(duì)象結(jié)構(gòu)的類很少改變,但經(jīng)常需要在此結(jié)構(gòu)上定義新的操作。,Visitor模式結(jié)構(gòu)圖,訪問者模式結(jié)構(gòu)圖如下:,java動(dòng)態(tài)代理類,Visitor(訪問者):為對(duì)象結(jié)構(gòu)中ConcreteElement的每一個(gè)類聲明一個(gè)訪問操作。使得訪問者可以確定正被訪問元素的具體類。這樣訪問者就可以通過該元素的特定接口直接訪問該類。,ConcreteVisitor(具體訪問者):實(shí)現(xiàn)Visitor接口,每個(gè)操作實(shí)現(xiàn)本算法的一部分,而該算法片斷仍是對(duì)應(yīng)于結(jié)構(gòu)中對(duì)象的類。ConcreteVisitor為該算法提供了上下文并存儲(chǔ)它的局部狀態(tài)。,Element(元素):定義一個(gè)accept()方法,并以一個(gè)訪問者為參數(shù)。,ConcreteElement(具體元素):實(shí)現(xiàn)Element接口,并實(shí)現(xiàn)其accept()方法,在該方法中通過一個(gè)訪問者參數(shù)來通知該訪問者它是否可被訪問。并將自己傳遞給訪問者。,ObjectStructure(對(duì)象結(jié)構(gòu)):提供一個(gè)高層的接口以允許該訪問者訪問它的元素,可以是一個(gè)復(fù)合對(duì)象或是一個(gè)集合。,Visitor模式示例,interface Visitable public void accept(Visitor visitor); class StringElement implements Visitable private String value; public StringElement(String string) value = string; public String getValue( ) return value; public void accept(Visitor visitor) visitor.visitString(this); interface Visitor public void visitString(StringElement stringE); public void visitFloat(FloatElement floatE); public void visitCollection(Collection collection); import java.util.*; class ConcreteVisitor implements Visitor /實(shí)現(xiàn)對(duì)Collection的元素的成功訪問 public void visitCollection(Collection collection) Iterator iterator = collection.iterator( ); while (iterator.hasNext() Object o = iterator.next( ); if (o instanceof Visitable) (Visitable) o).accept(this); else System.out.println(o.toString( ); public void visitString(StringElement stringE) System.out.println(“ + stringE.getValue( ) + “); public void visitFloat(FloatElement floatE) System.out.println(floatE.getValue().toString() + “f“); ,Visitor模式優(yōu)勢(shì)和不足,該設(shè)計(jì)模式的優(yōu)點(diǎn)主要有以下幾種:,將有關(guān)的行為集中到一個(gè)訪問者對(duì)象中,而不是分散到一個(gè)個(gè)的節(jié)點(diǎn)類中。,訪問者模式可以跨過幾個(gè)類的等級(jí)結(jié)構(gòu)訪問屬于不同的等級(jí)結(jié)構(gòu)中的成員類。,使得增加新的操作變的很容易,就是增加一個(gè)新的訪問者類。,該設(shè)計(jì)模式的不足主要有以下幾種:,visitor不能訪問被訪問者的私有變量。,增加一個(gè)新的ConcreteElement類很困難。,類結(jié)構(gòu)必須預(yù)知自己將會(huì)在visitor模式中使用,必須依賴于visitor接口。,其他模式-Interpreter模式,Interpreter模式即解釋器模式。描述怎樣在有了一個(gè)簡單的文法后,使用模式設(shè)計(jì)解釋這些語句。在解釋器模式中提到的語言是指任何解釋器對(duì)象都能夠解釋的任何組合。在解釋器模式中需要定義一個(gè)代表文法的命令類的等級(jí)結(jié)構(gòu),也就是一系列的組合規(guī)則。,public interface AbstractExpression void interpret( Context context ); public class TerminalExpression implements AbstractExpression private String stat; public TerminalExpression(String stat) stat = stat; public void interpret(Context c) /具體要實(shí)現(xiàn)的操作 public class NonterminalExpression implements AbstractExpression private AbstractExpression successor; public void setSuccessor(AbstractExpression successor) this.successor = successor; public AbstractExpression getSuccessor() return successor; public void interpret(Context context) /具體要實(shí)現(xiàn)的操作 ,Mediator模式,Mediator模式即調(diào)停者模式或中介者模式,該模式的思想是用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。,ConcreteMediator(具體中介者):具體中介者了解和維護(hù)它的各個(gè)同事,并協(xié)調(diào)各同事對(duì)象實(shí)現(xiàn)協(xié)作行為。,Colleague(同事類):每一個(gè)同事類都知道它的中介者對(duì)象。在需要與其他的同事通信的時(shí)候,與它的中介者通信。,Mediator(中介者):定義一個(gè)接口用于與各Colleague對(duì)象通信。,Memento模式,Memento模式即備忘錄模式,該模式的用意是在不破壞封裝的條件下,將一個(gè)對(duì)象的狀態(tài)捉住,并外部化,存儲(chǔ)起來,從而可以在將來合適的時(shí)候把這個(gè)對(duì)象還原到存儲(chǔ)時(shí)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年冀教版高一語文上冊(cè)階段測(cè)試試卷含答案
- 2025年滬教版七年級(jí)生物下冊(cè)階段測(cè)試試卷含答案
- 2025年統(tǒng)編版選修5歷史下冊(cè)階段測(cè)試試卷
- 2025年上教版九年級(jí)生物下冊(cè)階段測(cè)試試卷
- 2025年牛津譯林版九年級(jí)歷史下冊(cè)階段測(cè)試試卷
- 2025年度智慧門禁系統(tǒng)門衛(wèi)服務(wù)全面升級(jí)合同4篇
- 2025版高鐵建設(shè)農(nóng)民工勞動(dòng)合同規(guī)范文本3篇
- 技術(shù)專利資源共享合同(2篇)
- 二零二五版智能節(jié)能門窗工程分包合同樣本4篇
- 2025版醫(yī)療責(zé)任保險(xiǎn)合同范本4篇
- 《醫(yī)院財(cái)務(wù)分析報(bào)告》課件
- 2025老年公寓合同管理制度
- 2024-2025學(xué)年人教版數(shù)學(xué)六年級(jí)上冊(cè) 期末綜合卷(含答案)
- 2024中國汽車后市場(chǎng)年度發(fā)展報(bào)告
- 感染性腹瀉的護(hù)理查房
- 天津市部分區(qū)2023-2024學(xué)年高二上學(xué)期期末考試 物理 含解析
- 《人工智能基礎(chǔ)》全套英語教學(xué)課件(共7章)
- GB/T 35613-2024綠色產(chǎn)品評(píng)價(jià)紙和紙制品
- 2022-2023學(xué)年五年級(jí)數(shù)學(xué)春季開學(xué)摸底考(四)蘇教版
- 【螞蟻?!?024中國商業(yè)醫(yī)療險(xiǎn)發(fā)展研究藍(lán)皮書
- 軍事理論-綜合版智慧樹知到期末考試答案章節(jié)答案2024年國防大學(xué)
評(píng)論
0/150
提交評(píng)論