策略模式
一 意圖
在平時(shí)的軟件開(kāi)中,我們對(duì)一個(gè)功能可能有多種不同的實(shí)現(xiàn)方式。程序需要在這些不同的實(shí)現(xiàn)方式之間進(jìn)行切換。而實(shí)現(xiàn)方式的切換,程序中往往需要大量判斷邏輯的代碼。當(dāng)每增加一種新的實(shí)現(xiàn)方式后,程序的復(fù)雜度也會(huì)隨之增加。
對(duì)于這種情況,策略模式就是一種好的解決方案。使用策略模式,可以把這些實(shí)現(xiàn)方式轉(zhuǎn)移到相應(yīng)的具體策略類里面,這樣就可以消除程序大量的判斷邏輯的代碼,也可以很好的提高程序的擴(kuò)展性。
其實(shí)以上的每一種實(shí)現(xiàn)方式,對(duì)應(yīng)了策略模式中的一種算法。策略模式分開(kāi)了算法的定義和使用。
二 定義
策略模式定義一系列算法類,將每一個(gè)算法封裝起來(lái),并讓它們可以相互替換,策略模式讓算法獨(dú)立于使用它的客戶而變化。
三 類圖

Strategy******(抽象******策略類******):抽象策略類可以是接口,也可以是抽象類。它聲明了某種算法,在具體策略類中會(huì)現(xiàn)實(shí)了抽象策略類聲明的算法。
ConcreteStrategy******(具體策略類):具體策略類是抽象策略類的子類,它實(shí)現(xiàn)了抽象策略類聲明的算法。
*** Context******(環(huán)境類)******:***在環(huán)境類中,聲明了一個(gè)抽象策略類,用于定義所采用的策略。在環(huán)境類中我們使用具體的策略類。
四 代碼示例
以交通工具為例,假如我們要從A地去往B地。我們可以選擇諸如“公共汽車(chē)”,“火車(chē)”,“飛機(jī)”等多種交通工具。
這三種交通工具就相當(dāng)于三個(gè)具體的策略類。他們都有交通的屬性,可以把人和物品從一個(gè)地方轉(zhuǎn)移到另一個(gè)地方,只是實(shí)現(xiàn)方式不同而已。不同的方式就相當(dāng)于不同的算法。

我們定義了一個(gè)交通工具的抽象的策略接口。申明了一個(gè)run方法。



我們定義了三個(gè)具體的交通工具類(具體策略類),實(shí)現(xiàn)了抽象策略接口的run方法。三種交通工具提供了三種不同的run方法的實(shí)現(xiàn),這三種不同的run方法的就是一系列算法。

在環(huán)境類中,我們定義了抽象工具類的接口。通過(guò)屬性設(shè)置,我們可以替換不同的交通工具。在環(huán)境類中run方法中,封裝了設(shè)置交通工具的run方法。

運(yùn)行結(jié)果

五 總結(jié)
策略模式是一種對(duì)象行為型模式。它分離了算法的定義和使用。在服務(wù)端我們可以定義一系列的算法,這些算法有一個(gè)共同基類。客戶端只需要知道使用哪一個(gè)算法。使用策略模式,我們可以很方便的切換算法和增加新的算法。
優(yōu)點(diǎn):
策略模式可以在不修改代碼的情況下,可以任意切換算法。增加新的算法也很方便。符合了“開(kāi)閉原則”。
策略模式所有的算法都繼承自一個(gè)基類,便于對(duì)具體算法進(jìn)行統(tǒng)一管理。繼承可以在基類中抽象出所有算法的公共方法。
客戶端可以不需要知道算法的復(fù)雜度。只需要知道使用哪個(gè)算法。
缺點(diǎn):
策略模式中客戶端需要知道所有的算法,才能知道具體使用哪一個(gè)算法。
策略模式可能會(huì)使系統(tǒng)中產(chǎn)生多個(gè)具體的算法類。