1. 程式人生 > >設計模式應試複習篇(八)——11種行為型模式的類圖結構(1~6種)

設計模式應試複習篇(八)——11種行為型模式的類圖結構(1~6種)

1、職責鏈模式

1)職責鏈模式包含如下角色:

Handler:抽象處理者角色,它定義了一個處理請求的介面,一般設計為抽象類,由於不同的具體處理者處理請求的方式不同,因此在其中定義了抽象請求處理方法。因為每一個處理者的下家還是一個處理者,因此在抽象處理者中定義了一個抽象處理者型別的物件(如結構圖中的successor),作為其對下家的引用。通過該引用,處理者可以連成一條鏈。

ConcreteHandler:具體處理者角色,它是抽象處理者的子類,可以處理使用者請求,在具體處理者類中實現了抽象處理者中定義的抽象請求處理方法,在處理請求之前需要進行判斷,看是否有相應的處理許可權,如果可以處理請求就處理它,否則將請求轉發給後繼者;在具體處理者中可以訪問鏈中下一個物件,以便請求的轉發。

2)模式結構

3)例項:審批假條 某OA系統需要提供一個假條審批的模組,如果員工請假天數小於3天,主任可以審批該假條;如果員工請假天數大於等於3天,小於10天,經理可以審批;如果員工請假天數大於等於10天,小於30天,總經理可以審批;如果超過30天,總經理也不能審批,提示相應的拒絕資訊。

2、命令模式

1)命令模式包含如下角色 :

Command:抽象命令類一般是一個抽象類或介面,在其中聲明瞭用於執行請求的execute()等方法,通過這些方法可以呼叫請求接收者的相關操作。

ConcreteCommand:具體命令類是抽象命令類的子類,實現了在抽象命令類中宣告的方法,它對應具體的接收者物件,將接收者物件的動作繫結其中。在實現execute()方法時,將呼叫接收者物件的相關操作(Action)。

Invoker:呼叫者,即請求傳送者,它通過命令物件來執行請求。一個呼叫者並不需要在設計時確定其接收者,因此它只與抽象命令類之間存在關聯關係。在程式執行時可以將一個具體命令物件注入其中,再呼叫具體命令物件的execute()方法,從而實現間接呼叫請求接收者的相關操作。

Receiver:接收者執行與請求相關的操作,它具體實現對請求的業務處理。

2)模式結構

3)例項一:通過一個視覺化介面對配置檔案進行增刪改等操作,同時,將對配置檔案的操作請求記錄在日誌檔案中,如果重新建立配置檔案,只需要執行儲存在日誌檔案中的命令物件即可修改配置檔案。使用命令模式進行設計。

例項二:功能鍵設定 為了使用者使用方便,某系統提供了一系列功能鍵,使用者可以自定義功能鍵的功能,如功能鍵FunctionButton可以用於退出系統(SystemExitClass),也可以用於開啟幫助介面(DisplayHelpClass)。使用者可以通過修改配置檔案來改變功能鍵的用途,現使用命令模式來設計該系統,使得功能鍵類與功能類之間解耦,相同的功能鍵可以對應不同的功能。

 

3、直譯器模式

1)直譯器模式包含以下角色:

AbstractExpression: 抽象表示式聲明瞭抽象的解釋操作,它是所有終結符表示式和非終結符表示式的公共父類。

TerminalExpression: 終結符表示式是抽象表示式的子類,它實現了與文法中的終結符相關聯的解釋操作,在句子中的每一個終結符都是該類的一個例項。通常在一個直譯器模式中只有少數幾個終結符表示式類,它們的例項可以通過非終結符表示式組成較為複雜的句子。

AbstractExpression: 抽象表示式聲明瞭抽象的解釋操作,它是所有終結符表示式和非終結符表示式的公共父類。

TerminalExpression: 終結符表示式是抽象表示式的子類,它實現了與文法中的終結符相關聯的解釋操作,在句子中的每一個終結符都是該類的一個例項。通常在一個直譯器模式中只有少數幾個終結符表示式類,它們的例項可以通過非終結符表示式組成較為複雜的句子。

2)模式結構

3)例項:數學運算直譯器,現需要構造一個語言直譯器,使得系統可以執行整數間的乘、除和求模運算。如使用者輸入表示式“3 * 4 / 2 % 4”,輸出結果為2。使用直譯器模式實現該功能。

4、迭代器模式

1)迭代器模式包含以下角色:

Iterator:抽象迭代器,定義了訪問和遍歷元素的介面,聲明瞭相應方法,例如:用於獲取第一個元素的first()方法,用於訪問下一個元素的next()方法,用於判斷是否還有下一個元素的hasNext()方法,用於獲取當前元素的currentItem()方法等,在具體迭代器中將實現這些方法。

ConcreteIterator:具體迭代器,實現了抽象迭代器介面,完成對聚合物件的遍歷,同時在具體迭代器中通過遊標來記錄在聚合物件中所處的當前位置,在具體實現時,遊標通常是一個表示位置的非負整數。

Aggregate:抽象聚合類,用於儲存和管理元素物件,宣告一個createIterator()方法用於建立一個迭代器物件,充當抽象迭代器工廠角色。

ConcreteAggregate:具體聚合類,實現了在抽象聚合類中宣告的createIterator()方法,該方法返回一個與該具體聚合類對應的具體迭代器ConcreteIterator例項。

2)模式結構

3)例項:電視機遙控器 電視機遙控器就是一個迭代器的例項,通過它可以實現對電視機頻道集合的遍歷操作,本例項我們將模擬電視機遙控器的實現。

5、中介者模式

1)中介者模式包含如下角色 :

Mediator: 抽象中介者,它定義一個介面,該介面用於與各同事物件之間進行通訊。

ConcreteMediator: 具體中介者,它是抽象中介者的子類,通過協調各個同事物件來實現協作行為,它維持了對各個同事物件的引用。

Colleague: 抽象同事類,它定義各個同事類公有的方法,並聲明瞭一些抽象方法來供子類實現,同時它維持了一個對抽象中介者類的引用,其子類可以通過該引用來與中介者通訊。

ConcreteColleague: 具體同事類,它是抽象同事類的子類;每一個同事物件在需要和其他同事物件通訊時,先與中介者通訊,通過中介者來間接完成與其他同事類的通訊;在具體同事類中實現了在抽象同事類中宣告的抽象方法。

2)模式結構

3)例項:虛擬聊天室 某論壇系統欲增加一個虛擬聊天室,允許論壇會員通過該聊天室進行資訊交流,普通會員可以給其他會員傳送文字資訊,鑽石會員既可以給其他會員傳送文字資訊,還可以傳送圖片資訊。該聊天室可以對指定字元進行過濾,如“C”等字元;還可以對傳送的圖片大小進行控制。用中介者模式設計該虛擬聊天室。

6、備忘錄模式

1)備忘錄模式包含如下角色:

Originator:原發器,它是一個普通類,可以建立一個備忘錄,並存儲它的當前內部狀態,也可以使用備忘錄來恢復其內部狀態,一般將需要儲存內部狀態的類設計為原發器。

Memento:備忘錄,儲存原發器的內部狀態,根據原發器來決定儲存哪些內部狀態。備忘錄的設計一般可以參考原發器的設計,根據實際需要確定備忘錄類中的屬性。需要注意的是,除了原發器本身與負責人類之外,備忘錄物件不能直接供其他類使用,原發器的設計在不同的程式語言中實現機制會有所不同。

Caretaker:負責人又稱為管理者,它負責儲存備忘錄,但是不能對備忘錄的內容進行操作或檢查。在負責人類中可以儲存一個或多個備忘錄物件,它只負責儲存物件,而不能修改物件,也無須知道物件的實現細節。

2)模式結構

3)例項:使用者資訊操作撤銷 某系統提供了使用者資訊操作模組,使用者可以修改自己的各項資訊。為了使操作過程更加人性化,現使用備忘錄模式對系統進行改進,使得使用者在進行了錯誤操作之後可以恢復到操作之前的狀態。