軟件設(shè)計(jì)模式之行為模式_第1頁
軟件設(shè)計(jì)模式之行為模式_第2頁
軟件設(shè)計(jì)模式之行為模式_第3頁
軟件設(shè)計(jì)模式之行為模式_第4頁
軟件設(shè)計(jì)模式之行為模式_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第四章行為模式 1課程目標(biāo) Observer模式 Iterator模式 Strategy模式 Template模式 Visitor模式 Chain of Responsibility模式 Command模式 其他模式,如Interpreter模式、Mediator模式等 2體驗(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接口,Draw

2、Command實(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)建窗體界面和各種事件 3行為模式概述 行為模式涉及到算法和對(duì)象間職責(zé)的分配,行為模式描述了對(duì)象和類的模式,以及它們之間的通信模式,這些模式刻劃了在程序運(yùn)行時(shí)難以跟蹤的復(fù)雜的控制流。 可分為行為類模式和行為對(duì)象模式兩種:(1)行為類模式使用繼承機(jī)制在類間分派行為。 (2)行為對(duì)象模式使用對(duì)

3、象復(fù)合而不是繼承。一些行為對(duì)象模式描述了一組對(duì)等的對(duì)象怎樣相互協(xié)作以完成其中任何一個(gè)對(duì)象都無法單獨(dú)完成的任務(wù)。這里一個(gè)重要的問題是對(duì)等對(duì)象如何互相了解對(duì)方。對(duì)等對(duì)象可以保持顯式的對(duì)對(duì)方的引用,但那會(huì)增加它們的耦合度。在極端情況下,每一個(gè)對(duì)象都要了解所有其他的對(duì)象。 4Chain 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所捕捉的異常是否相符合,如果

4、符合就執(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ì)象集合。 5Chain 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:向鏈上的具體

5、處理者即ConcreteHandler對(duì)象提交請(qǐng)求。 6Chain 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(Char

6、acter.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(

7、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)7職責(zé)鏈模式優(yōu)勢(shì)和

8、不足 職責(zé)鏈模式主要有以下幾個(gè)優(yōu)點(diǎn): 降低耦合度 職責(zé)鏈模式不足:效率低 ,一個(gè)請(qǐng)求的完成可能要遍歷到最后才可能完成。 擴(kuò)展性差,在該模式中,一定要有一個(gè)統(tǒng)一的Handler接口。 增強(qiáng)了給對(duì)象指派職責(zé)的靈活性 8Command模式 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ì)象可以有

9、一個(gè)與初始請(qǐng)求無關(guān)的生存期。 支持取消操作。 支持修改日志。用構(gòu)件在原語操作上的高層操作構(gòu)造一個(gè)系統(tǒng)。 9Command模式結(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è)定它的接收者。 10Command模式示例Command模式在界面

10、設(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

11、) 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”, ExitBu

12、tton類實(shí)現(xiàn)關(guān)閉窗體的操作。都很類似所以只給出了Blue類的參考代碼。11Command模式優(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ì)象一樣被使用和繼承。 12 Iterator模式It

13、erator模式即迭代器模式,用于遍歷集合類的標(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)迭代)。 13 Iterator模式結(jié)構(gòu)圖迭代器模式結(jié)構(gòu)圖如下: Iterator:定義訪問和遍歷元素的接口。 ConcreteIterator:實(shí)現(xiàn)了Iterator接口的具體迭代器,用于對(duì)聚合對(duì)象遍歷時(shí)跟蹤當(dāng)前的位置。

14、Aggregate:定義創(chuàng)建相應(yīng)迭代器的接口。 ConcreteAggregate:實(shí)現(xiàn)了Aggregate接口的聚合對(duì)象,實(shí)現(xiàn)了返回一個(gè)ConcreteIterator實(shí)例的方法。 14 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

15、 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 Listpublic MyIterator getIterator( );public MyIterator getReverseIterator( );import java.util.Vect

16、or;public class MyVector extends Vector implements MyListpublic MyIterator getIterator() return new ListIterator(this); public MyIterator getReverseIterator() return new ReverseListIterator(this); 15 Iterator模式優(yōu)勢(shì)和不足 使用迭代抽象:使得訪問一個(gè)聚合對(duì)象的內(nèi)容而無需暴露它的內(nèi)部表示。 提供迭代多態(tài):為遍歷不同的集合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上進(jìn)行操作。

17、主要缺點(diǎn)在與迭代器的健壯性問題:遍歷的同時(shí)更改迭代器所在的集合結(jié)構(gòu),會(huì)導(dǎo)致問題出現(xiàn)。 Iterator模式優(yōu)點(diǎn)和不足: 16Observer模式 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ì)象,而

18、它又不能假定其它對(duì)象是誰。也就是說你不希望這些對(duì)象是緊密耦合的。 17Observer模式結(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)一致。 18Observer模式示例使

19、用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

20、();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)過程類似, 19import java.util.*;abstract class NumberObject /儲(chǔ)存Observerprivate Vector observe

21、rs = new Vector( );/新增Observerpublic void addObserver(Observer observer) observers.add(observer);/刪除Observerpublic void deleteObserver(Observer observer) observers.remove(observer);/通知Observer public void notifyObservers( ) Iterator it = observers.iterator( );while (it.hasNext() Observer o = (Observ

22、er) 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

23、; i 10; i+) number = random.nextInt(30);notifyObservers(); /通知Observer20Observer模式優(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è)觀察者屬

24、于哪一個(gè)具體的類。這樣目標(biāo)和觀察者之間的耦合是抽象的和最小的。因?yàn)槟繕?biāo)和觀察者不是緊密耦合的,它們可以屬于一個(gè)系統(tǒng)中的不同抽象層次。一個(gè)處于較低層次的目標(biāo)對(duì)象可與一個(gè)處于較高層次的觀察者通信并通知它,這樣就保持了系統(tǒng)層次的完整性。 21Strategy模式 Strategy模式使得算法與算法的使用者相分離,同時(shí)減少了二者間的耦合度,使得算法可獨(dú)立于使用它的客戶而變化;同時(shí),由于設(shè)計(jì)粒度的減小,程序的復(fù)用性也得到了進(jìn)一步提高,分離出來的算法可以更好地適應(yīng)復(fù)用的需要。 模式介紹 主要適用于以下情況: 如果在一個(gè)系統(tǒng)中有許多類,它們之間的區(qū)別僅在于它們的行為.一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。

25、 一個(gè)系統(tǒng)的算法使用的數(shù)據(jù)不可以讓客戶端知道.如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)。 22Strategy模式結(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)的算法或行為。 23Strategy模式示例abstract class Compositor public abstract i

26、nt 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.p

27、rintln(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封裝用于獲

28、取數(shù)組最大值的方法,MinCompositor封裝用于獲取數(shù)組最小值的方法,實(shí)現(xiàn)過程類似。 24Strategy模式優(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)系的辦法,從而把算法或行為的使用者和算法或行為本身分隔開。 25Te

29、mplate 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ò)展。 26Template Method模式結(jié)構(gòu)圖模板方法模式

30、結(jié)構(gòu)圖如下: AbstractClass(抽象類):定義一些抽象的原語操作,具體的子類重定義它們以實(shí)現(xiàn)一個(gè)算法步驟。 ConcreteClass(具體類):繼承AbstractClass類,并實(shí)現(xiàn)AbstractClass中的抽象方法以完成算法中與特定子類相關(guān)的步驟。 27Template Method模式示例 public abstract class AbstractRead protected String resource;public void getContent() if(open() readContent(); close(); protected abstract bool

31、ean 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.openConne

32、ction( );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) Syste

33、m.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)過程類似。 28Template Method模式優(yōu)勢(shì)和不足 Template Method模式獲得一種反向控制結(jié)構(gòu)的效果,這也是面向?qū)ο笙到y(tǒng)的分析和設(shè)計(jì)中一個(gè)原則依賴倒置(Dependency Inversion Principles)。其含義就是父類調(diào)

34、用子類的操作(高層模塊調(diào)用低層模塊的操作),低層模塊實(shí)現(xiàn)高層模塊聲明的接口。這樣控制權(quán)在父類(高層模塊),低層模塊反而要依賴高層模塊。 繼承的強(qiáng)制性約束關(guān)系也讓Template Method模式有不足的地方,我們可以看到對(duì)于各個(gè)ConcreteClass類中實(shí)現(xiàn)的方法,是不能被別的類復(fù)用的。 29Visitor模式 Visitor模式即訪問者模式,該模式的定義:作用于某個(gè)對(duì)象群中各個(gè)對(duì)象的操作,它可以使你在不改變這些對(duì)象本身的情況下,定義作用于這些對(duì)象上的新操作。模式介紹 該模式主要適用于以下幾種情況: 當(dāng)該對(duì)象結(jié)構(gòu)被很多應(yīng)用共享時(shí)。 一個(gè)對(duì)象結(jié)構(gòu)包含很多類對(duì)象,它們有不同的接口,而想對(duì)這些對(duì)

35、象實(shí)施一些依賴于其具體類的操作。 需要對(duì)一個(gè)對(duì)象結(jié)構(gòu)中的對(duì)象進(jìn)行很多不同的并且不相關(guān)的操作定義對(duì)象結(jié)構(gòu)的類很少改變,但經(jīng)常需要在此結(jié)構(gòu)上定義新的操作。 30Visitor模式結(jié)構(gòu)圖訪問者模式結(jié)構(gòu)圖如下: 31java動(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為該算法提供了上下

36、文并存儲(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è)集合。 32Visitor模式示例interface Visitable public void accept(Visitor visitor);class StringElement implemen

37、ts 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);pu

38、blic 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 Visi

39、table)(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);33Visitor模式優(yōu)勢(shì)和不足 該設(shè)計(jì)模式的優(yōu)點(diǎn)主要有以下幾種:將有關(guān)的行

40、為集中到一個(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接口。 34其他模式-Interpreter模式Interpreter模式即解釋器模式。描述怎樣在有了一個(gè)簡(jiǎn)單的文法后,使用模式設(shè)計(jì)解釋這些語句。在解釋器模式中提到的語言是指任何解釋器對(duì)象都能夠解釋的任何組合。

41、在解釋器模式中需要定義一個(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 N

42、onterminalExpression 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)的操作35Mediator模式 Mediator模式即

43、調(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ì)象通信。 36Memento模式 Memento模式即備忘錄模式,該模式的用意是在不破壞封裝的條件下,將一個(gè)對(duì)象的狀態(tài)捉住,并外部化,存儲(chǔ)起來,從而可以在將來合適的時(shí)候把這個(gè)對(duì)象還原到存儲(chǔ)時(shí)的狀態(tài)。 class

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論