策略模式是指有一定行動內容的相對穩(wěn)定的策略名稱。策略模式在古代中又稱“計策”,簡稱“計”,如《漢書·高帝紀上》:“漢王從其計”。這里的“計”指的就是計謀、策略。策略模式具有相對穩(wěn)定的形式,如“避實就虛”、“出奇制勝”等。一定的策略模式,既可應用于戰(zhàn)略決策,也可應用于戰(zhàn)術決策;既可實施于大系統(tǒng)的全局性行動,也可實施于大系統(tǒng)的局部性行動。
簡介策略模式作為一種軟件設計模式,指對象有某個行為,但是在不同的場景中,該行為有不同的實現(xiàn)算法。比如每個人都要“交個人所得稅”,但是“在美國交個人所得稅”和“在中國交個人所得稅”就有不同的算稅方法。
策略模式:
定義了一族算法(業(yè)務規(guī)則);
封裝了每個算法;
這族的算法可互換代替(interchangeable)。1
組成—抽象策略角色: 策略類,通常由一個接口或者抽象類實現(xiàn)。
—具體策略角色:包裝了相關的算法和行為。
—環(huán)境角色:持有一個策略類的引用,最終給客戶端調用。2
應用場景應用場景:
1、 多個類只區(qū)別在表現(xiàn)行為不同,可以使用Strategy模式,在運行時動態(tài)選擇具體要執(zhí)行的行為。
2、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實現(xiàn)。
3、 對客戶隱藏具體策略(算法)的實現(xiàn)細節(jié),彼此完全獨立。1
優(yōu)缺點優(yōu)點1、 策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行為族。恰當使用繼承可以把公共的代碼轉移到父類里面,從而避免重復的代碼。
2、 策略模式提供了可以替換繼承關系的辦法。繼承可以處理多種算法或行為。如果不是用策略模式,那么使用算法或行為的環(huán)境類就可能會有一些子類,每一個子類提供一個不同的算法或行為。但是,這樣一來算法或行為的使用者就和算法或行為本身混在一起。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯混合在一起,從而不可能再獨立演化。繼承使得動態(tài)改變算法或行為變得不可能。
3、 使用策略模式可以避免使用多重條件轉移語句。多重轉移語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統(tǒng)統(tǒng)列在一個多重轉移語句里面,比使用繼承的辦法還要原始和落后。
缺點1、客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時選擇恰當?shù)乃惴?。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。
2、 策略模式造成很多的策略類,每個具體策略類都會產(chǎn)生一個新類。有時候可以通過把依賴于環(huán)境的狀態(tài)保存到客戶端里面,而將策略類設計成可共享的,這樣策略類實例可以被不同客戶端使用。換言之,可以使用享元模式來減少對象的數(shù)量。2
實現(xiàn):出行旅游:
代碼實現(xiàn):