定義一組演算法,將每個演算法都封裝起來,並且使他們之間可以互換。
型別:行為類模式
類圖:
策略模式是對演算法的封裝,把一系列的演算法分別封裝到對應的類中,並且這些類實現相同的介面,相互之間可以替換。在前面說過的行為類模式中,有一種模式也是關注對演算法的封裝——模版方法模式,對照類圖可以看到,策略模式與模版方法模式的區別僅僅是多了乙個單獨的封裝類context,它與模版方法模式的區別在於:在模版方法模式中,呼叫演算法的主體在抽象的父類中,而在策略模式中,呼叫演算法的主體則是封裝到了封裝類context中,抽象策略strategy一般是乙個介面,目的只是為了定義規範,裡面一般不包含邏輯。其實,這只是通用實現,而在實際程式設計中,因為各個具體策略實現類之間難免存在一些相同的邏輯,為了避免重複的**,我們常常使用抽象類來擔任strategy的角色,在裡面封裝公共的**,因此,在很多應用的場景中,在策略模式中一般會看到模版方法模式的影子。
**實現
inte***ce
istrategy
class
concretestrategy1
implements
istrategy
}class
concretestrategy2
implements
istrategy
}class
context
public
void
execute()
}public
class
client
}
優點:
缺點:
必須對客戶端(呼叫者)暴露所有的策略類,因為使用哪種策略是由客戶端來決定的,因此,客戶端應該知道有什麼策略,並且了解各種策略之間的區別,否則,後果很嚴重。例如,有乙個排序演算法的策略模式,提供了快速排序、氣泡排序、選擇排序這三種演算法,客戶端在使用這些演算法之前,是不是先要明白這三種演算法的適用情況?再比如,客戶端要使用乙個容器,有鍊錶實現的,也有陣列實現的,客戶端是不是也要明白鍊錶和陣列有什麼區別?就這一點來說是有悖於迪公尺特法則的。
做物件導向設計的,對策略模式一定很熟悉,因為它實質上就是物件導向中的繼承和多型,在看完策略模式的通用**後,我想,即使之前從來沒有聽說過策略模式,在開發過程中也一定使用過它吧?至少在在以下兩種情況下,大家可以考慮使用策略模式,
策略模式是一種簡單常用的模式,我們在進行開發的時候,會經常有意無意地使用它,一般來說,策略模式不會單獨使用,跟模版方法模式、工廠模式等混合使用的情況比較多。
設計模式 策略設計模式
策略設計模式其實就是多型的使用,父類引用指向子類物件。策略模式的最大特點是使得演算法可以在不影響客戶端的情況下發生變化,從而改變不同的功能。策略模式的缺點其實也很明顯,在於策略模式把每一種具體的策略都封裝成乙個實現類,如果策略有很多的話,很顯然是實現類就會導致過多,顯得臃腫。案列 author de...
設計模式 策略模式
策略模式是一種定義一系列演算法的方法,從概念上來看,所有這些方法完成的都是相同的工作,只是實現不同,他們可以用相同的方式呼叫所有的演算法,減少了演算法類和使用演算法類之間的耦合.優點 策略模式的strategy類層次為context定義了一系列可供重用的演算法和行為,繼承有助於吸取這些演算法中的公共...
設計模式 策略模式
定義了演算法家族,分別封裝起來,讓他們之間可以相互替代,此模式讓演算法的變化,不會影響到使用演算法的客戶端 定義抽象類 分別實現抽象類,不同的物件 然後用乙個類初始化,並傳入具體的策略物件 根據具體的策略物件,呼叫其演算法的方法 客戶端 是由於例項化不同的策略,所以最終在呼叫 類時,所獲得的結果時不...