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

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

7、觀察者模式

1)觀察者模式包含如下角色

Subject:目標又稱為主題,它是指被觀察的物件。在目標中定義了一個觀察者集合,一個觀察目標可以接受任意數量的觀察者來觀察,它提供一系列方法來增加和刪除觀察者物件,同時它定義了通知方法notify()。目標類可以是介面,也可以是抽象類或具體類。

ConcreteSubject:具體目標是目標類的子類,通常它包含有經常發生改變的資料,當它的狀態發生改變時,向它的各個觀察者發出通知;同時它還實現了在目標類中定義的抽象業務邏輯方法(如果有的話)。如果無須擴充套件目標類,則具體目標類可以省略。

Observer:觀察者將對觀察目標的改變做出反應,觀察者一般定義為介面,該介面聲明瞭更新資料的方法update(),因此又稱為抽象觀察者。

ConcreteObserver:具體觀察者中維護一個指向具體目標物件的引用,它儲存具體觀察者的有關狀態,這些狀態需要和具體目標的狀態保持一致;它實現了在抽象觀察者中定義的update()方法。通常在實現時,可以呼叫具體目標類的attach()方法將自己新增到目標類的集合中或通過detach()方法將自己從目標類的集合中刪除。

2)模式結構

3)例項一:貓、狗與老鼠 假設貓是觀察目標,老鼠和狗是觀察者,貓叫,則老鼠跑,狗也跟著叫,使用觀察者模式描述該過程。

例項二:自定義登入控制元件 Java事件處理模型中應用了觀察者模式,下面通過一個例項來學習如何自定義GUI元件,如包含兩個文字框和兩個按鈕的登入元件LoginBean,並給該控制元件增加相應的事件。該例項基於Java Swing/AWT控制元件,在Swing/AWT的相關類中封裝了對事件的底層處理。

8、狀態模式

1)狀態模式包含如下角色

Context:環境類,又稱為上下文類,它是擁有多種狀態的物件。由於環境類的狀態存在多樣性且在不同狀態下物件的行為有所不同,因此將狀態獨立出去形成單獨的狀態類。在環境類中維護一個抽象狀態類State的例項,這個例項定義當前狀態,在具體實現時,它是一個State子類的物件。

State:抽象狀態類,它用於定義一個介面以封裝與環境類的一個特定狀態相關的行為,在抽象狀態類中聲明瞭各種不同狀態對應的方法,而在其子類中實現類這些方法,由於不同狀態下物件的行為可能不同,因此在不同子類中方法的實現可能存在不同,相同的方法可以寫在抽象狀態類中。

ConcreteState:具體狀態類,它是抽象狀態類的子類,每一個子類實現一個與環境類的一個狀態相關的行為,每一個具體狀態類對應環境的一個具體狀態,不同的具體狀態類其行為有所不同。

2)模式結構

3)例項一:論壇使用者等級。在某論壇系統中,使用者可以發表留言,發表留言將增加積分;使用者也可以回覆留言,回覆留言也將增加積分;使用者還可以下載檔案,下載檔案將扣除積分。該系統使用者分為三個等級,分別是新手、高手和專家,這三個等級對應三種不同的狀態,這三種狀態分別定義如下:(1) 如果積分小於100分,則為新手狀態,使用者可以發表留言、回覆留言,但是不能下載檔案。 (2) 如果積分大於等於100分但小於1000分,則為高手狀態,使用者可以發表留言、回覆留言,還可以下載檔案,而且使用者在發表留言時可以獲取雙倍積分。如果下載檔案後積分小於0,則不能下載該檔案。(3) 如果積分大於等於1000分,則為專家狀態,使用者可以發表留言、回覆留言和下載檔案,使用者除了在發表留言時可以獲取雙倍積分外,下載檔案只扣除所需積分的一半。如果下載檔案後積分小於0,則不能下載該檔案。

例項二:銀行賬戶,在某銀行系統定義的賬戶有三種狀態:(1) 如果賬戶中餘額大於等於0,此時賬戶的狀態為正常狀態,既可以向賬戶存款也可以從中取款;(2) 如果賬戶中餘額小於0,並且大於-2000,則賬戶的狀態為透支狀態(Overdraft State),此時使用者既可以向該賬戶存款也可以從該賬戶取款,但需要按天計算利息;(3) 如果賬戶中餘額等於-2000,那麼賬戶的狀態為受限狀態(Restricted State),此時使用者只能向該賬戶存款,不能再從中取款,同時也將按天計算利息;(4) 根據餘額的不同,以上三種狀態可發生相互轉換。

9、策略模式

1)策略模式包含如下角色

Context:環境類是使用演算法的角色,它在解決某個問題(即實現某個方法)時可以採用多種策略。在環境類中維持一個對抽象策略類的引用例項,用於定義所採用的策略。

Strategy:抽象策略類為所支援的演算法聲明瞭抽象方法,是所有策略類的父類,它可以是抽象類或具體類,也可以是介面。環境類通過抽象策略類中宣告的方法在執行時呼叫具體策略類中實現的演算法。

ConcreteStrategy:具體策略類實現了在抽象策略類中宣告的演算法,執行時具體策略物件將覆蓋環境類中定義的抽象策略物件,使用一種具體的演算法實現某個業務處理

2)模式結構

3)例項一:排序策略 某系統提供了一個用於對陣列資料進行操作的類,該類封裝了對陣列的常見操作,如查詢陣列元素、對陣列元素進行排序等。現以排序操作為例,使用策略模式設計該陣列操作類,使得客戶端可以動態地更換排序演算法,可以根據需要選擇氣泡排序或選擇排序或插入排序,也能夠靈活地增加新的排序演算法。

例項二:旅遊出行策略 旅遊出行方式可以有多種,如可以乘坐飛機旅遊,也可以乘火車旅遊,如果有興趣自行車遊也是一種極具樂趣的出行方式。不同的旅遊出行方式有不同的實現過程,客戶根據自己的需要選擇一種合適的旅遊方式。在本例項中我們用策略模式來模擬這一過程。

10、模板方法模式

1)模式包含如下角色

AbstractClass:抽象類定義了一系列基本操作,這些基本操作可以是具體的,也可以是抽象的,每一個基本操作對應演算法的一個步驟,在其子類中可以重定義或實現這些步驟。同時,抽象類還實現了一個模板方法,用於定義一個演算法的框架,模板方法不僅可以呼叫在抽象類中實現的基本方法,也可以呼叫在抽象類的子類中實現的基本方法,還可以呼叫其他物件中的方法。

ConcreteClass:具體子類是抽象類的子類,用於實現在抽象類中宣告的抽象基本操作以完成子類特定演算法的步驟,也可以覆蓋在父類中已經實現的具體基本操作。

2)模式結構

3)例項一:銀行業務辦理流程 在銀行辦理業務時,一般都包含幾個基本步驟,首先需要取號排隊,然後辦理具體業務,最後需要對銀行工作人員進行評分。無論具體業務是取款、存款還是轉賬,其基本流程都一樣。現使用模板方法模式模擬銀行業務辦理流程。

例項二:資料庫操作模板 對資料庫的操作一般包括連線、開啟、使用、關閉等步驟,在資料庫操作模板類中我們定義了connDB()、openDB()、useDB()、closeDB()四個方法分別對應這四個步驟。對於不同型別的資料庫(如SQL Server和Oracle),其操作步驟都一致,只是連線資料庫connDB()方法有所區別,現使用模板方法模式對其進行設計。

11、訪問者模式

1)訪問者模式包含如下角色:

Vistor: 抽象訪問者

ConcreteVisitor: 具體訪問者

Element: 抽象元素

ConcreteElement: 具體元素

ObjectStructure: 物件結構

2)模式結構

3)例項一:購物車 顧客在超市中將選擇的商品,如蘋果、圖書等放在購物車中,然後到收銀員處付款。在購物過程中,顧客需要對這些商品進行訪問,以便確認這些商品的質量,之後收銀員計算價格時也需要訪問購物車內顧客所選擇的商品。此時,購物車作為一個ObjectStructure(物件結構)用於儲存各種型別的商品,而顧客和收銀員作為訪問這些商品的訪問者,他們需要對商品進行檢查和計價。不同型別的商品其訪問形式也可能不同,如蘋果需要過秤之後再計價,而圖書不需要。使用訪問者模式來設計該購物過程。

例項二:獎勵審批系統 某高校獎勵審批系統可以實現教師獎勵和學生獎勵的審批(AwardCheck),如果教師發表論文數超過10篇或者學生論文超過2篇可以評選科研獎,如果教師教學反饋分大於等於90分或者學生平均成績大於等於90分可以評選成績優秀獎,使用訪問者模式設計該系統,以判斷候選人集合中的教師或學生是否符合某種獲獎要求。