設計模式---策略模式(Strategy Pattern)

先說幾個例子,讓大家對策略模式有個感性的認識;比如玩RPG遊戲時,一個人物可以擁有多種武器,但是攻擊時只能使用一把武器,切換武器的過程其實就是一個策略模式的應用。

故事案例:鴨子很多種(活生生的鴨子,橡皮鴨,模型鴨,木頭鴨。。。),共性是可以swim,display(即給別人看),活生生的鴨子可以嘎嘎叫,橡皮鴨子可以吱吱叫,模型鴨可以飛,木頭鴨什麼特別之處都沒有,那我們怎麼處理這個問題呢?

思路一:鴨子作爲一個抽象類(Duck),然後這些具體的鴨子就繼承他,並重新新增一些自己特有的方法。(好像感覺挺好的設計是吧!清晰明瞭!)

缺陷:代碼的可重用性不高,兩個不同類型的鴨子,如果都可以嘎嘎叫,那麼嘎嘎叫的方法(我把它定義quack())需要寫兩遍,兩個還好啊,那要是一百個呢。。。

思路二:既然要代碼可重用性高的話,那麼把quack()方法放到抽象類中,不同的鴨子去繼承他就行了,但是還是有問題,第一:我的模型鴨不會叫,你現在卻可以讓他嘎嘎叫,第二:我的橡皮鴨是吱吱叫,現在卻是嘎嘎叫。。。有人就會說,我可以在子類重載這些方法啊,還是那個問題,一百個呢,而且還容易改出錯。

思路三:設計原則是:多用組合,少用繼承;現在我來說說這個的意思,對於不同的鴨子,他們的行爲是不同的,從而導致處理方式不同,那麼我們把不同的行爲看成不同的算法;對於鴨子來說,他們應該是擁有(has-a)某種行爲,而不是這種行爲是(is-a)某種鴨子的;所以,把不同的行爲定義爲不同的類或接口。(QuackBehavior 和 FlyBehavior),具體的行爲就實現這兩種接口即可。

對於抽象類鴨子(Duck)只需持有這兩種行爲的父類(面向接口編程)引用,就可以實現不同行爲的切換。


對應的UML圖:

沒有工具所以偷懶了。。。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章