策略模式 一 開發模擬鴨子游戲 已經有一個很成功的鴨子模擬游戲,裡面有各種鴨子,一邊游泳,一邊呱呱叫。該系統採用的標準OO技術,設計了一個鴨子超類,並讓各種鴨子繼承此超類。 實現如下:超類中定義了鴨子的各種行為,包括呱呱叫,游泳,外觀等。由於各種鴨子的外觀是不一樣的,display方法抽象出來,各個 ...
策略模式
一 開發模擬鴨子游戲
已經有一個很成功的鴨子模擬游戲,裡面有各種鴨子,一邊游泳,一邊呱呱叫。該系統採用的標準OO技術,設計了一個鴨子超類,並讓各種鴨子繼承此超類。
實現如下:超類中定義了鴨子的各種行為,包括呱呱叫,游泳,外觀等。由於各種鴨子的外觀是不一樣的,display方法抽象出來,各個子類各自實現它。
這時候,游戲需要大更新,新增鴨子飛行模式,該怎麼辦呢?在目前的代碼基礎上變更如下:在超類中添加飛行行為fly(),這樣所有的鴨子子類都繼承了飛行方法。
但是游戲上線後,發現所有的鴨子都會飛了,沒有翅膀的橡皮鴨也在天上飛,不符合實際。怎麼解決?讓橡皮鴨重寫父類的飛行方法。
總結:這種設計模式,每當有新的鴨子添加進來,都要去確認需不需要重寫飛行方法,代碼復用率很低且極易出錯
二 跳出繼承,試試介面
我們現在就變化和不會變化的部分做分割,目前來說,鴨子的呱呱叫和飛行行為是會存在變化的。不會變化的如游泳,外觀,繼續保持在超類,會變化的行為抽象成
介面,由具體的行為來實現介面。
介面實現如下:
三 整合代碼實現
1.我們先創建飛行介面
2.接著實現兩種飛行能力,後期有新的飛行能力,可以再添加
3.創建鴨子父類,由於父類決定不了每個鴨子的長相,將外觀這個方法抽象,所以父類也為抽象類
4.創建一個毛毛鴨子類
5.測試毛毛鴨的行為,併在運行中動態改變它的飛行能力
運行結果:
四 封裝行為的大局觀
根據新需求,對模擬鴨子游戲進行重構後,我們所期望的一切都有:鴨子繼承父類Duck,飛行行為實現了FlyBehavior介面
這個設計模式就是策略模式,該模式的設計原則是多用組合,少用繼承。
如你所見,使用組合建立系統具有很大的彈性,不僅可以將演算法族封裝成類,更可以再運行時動態的改變行為,只要組合的
行為對象符合正確的介面標準即可。
策略模式:定義了演算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。
UML圖如下: