定義:
該模式定義了一系列算法,并將每個(gè)算法封裝起來(lái),使它們可以互相替換,且算法的變化不會(huì)影響使用算法的用戶。
策略模式屬于對(duì)象行為模式,它通過(guò)對(duì)算法進(jìn)行封裝,把使用算法的責(zé)任和算法的實(shí)現(xiàn)方式分割開來(lái),并委派給不同的對(duì)象對(duì)這些算法進(jìn)行管理。
通俗理解:
在現(xiàn)實(shí)生活中經(jīng)常遇到某種目標(biāo)存在多種策略可供選擇的情況。
例如:出行可以選擇乘坐火車、汽車、私家車、自行車等。
優(yōu)點(diǎn):
1、多重條件語(yǔ)句不易維護(hù),使用策略模式可以避免使用多重條件語(yǔ)句,如if…else 語(yǔ)句、switch…case語(yǔ)句。
2、使用恰當(dāng)?shù)睦^承,可以把公共代碼轉(zhuǎn)移到父類里面,避免重復(fù)代碼。
3、策略模式可以提供相同的行為不同的實(shí)現(xiàn),客戶可以根據(jù)不同時(shí)間或空間要求選擇不同的。
4、策略模式完美支持開閉原則,可以在不修改原代碼的情況下,靈活增加算法。
5、策略模式實(shí)現(xiàn)了對(duì)算法的使用和實(shí)現(xiàn),二者分離。
缺點(diǎn):
1、使用者必須了解所有算法的區(qū)別,以便選擇恰當(dāng)?shù)乃惴悺?/p>
2、會(huì)造成很多策略類,增加維護(hù)難度。
策略模式結(jié)構(gòu):
1、抽象策略類:定義一個(gè)公共接口,各種不同算法以不同的方式實(shí)現(xiàn)這個(gè)接口,環(huán)境角色使用這個(gè)接口調(diào)用不同算法,一般使用接口或者抽象類實(shí)現(xiàn)。
2、具體策略類:實(shí)現(xiàn)了抽象策略定義的接口,提供具體的算法實(shí)現(xiàn)。
3、環(huán)境類: 持有一個(gè)策略類的引用,最終給客戶端調(diào)用。
代碼實(shí)現(xiàn)場(chǎng)景:
劉備要到江東娶老婆了,走之前諸葛亮給趙云(伴郎)三個(gè)錦囊妙計(jì),說(shuō)是按天機(jī)拆開解決棘手問(wèn)題。
先說(shuō)這個(gè)場(chǎng)景中的要素:三個(gè)妙計(jì),一個(gè)錦囊,一個(gè)趙云,妙計(jì)是小亮同志給的,妙計(jì)是放置在錦囊里,俗稱就是錦囊妙計(jì)嘛,那趙云就是一個(gè)干活的人,從錦囊中取出妙計(jì),執(zhí)行,然后獲勝。
上代碼:
/** * 首先定一個(gè)策略接口,這是諸葛亮老人家給趙云的三個(gè)錦囊妙計(jì)的接口 */public interface IStrategy { //每個(gè)錦囊妙計(jì)都是一個(gè)可執(zhí)行的算法 public void operate();}/** * 妙計(jì)有了,需要把妙計(jì)放到錦囊里面 */public class Context { // 構(gòu)造函數(shù),你要使用那個(gè)妙計(jì) private IStrategy iStrategy; public Context(IStrategy iStrategy) { this.iStrategy = iStrategy; } // 開始使用錦囊 public void operate() { this.iStrategy.operate(); }}public class BackDoor implements IStrategy { /** * 妙計(jì)一 : 找喬國(guó)老幫忙,使孫權(quán)不能殺劉備 */ @Override public void operate() { System.out.println(“找喬國(guó)老幫忙,讓吳國(guó)太給孫權(quán)施加壓力”); }}/** * 妙計(jì)二:求吳國(guó)太開個(gè)綠燈 */public class GivenGreenLight implements IStrategy { @Override public void operate() { System.out.println(“求吳國(guó)太開個(gè)綠燈,放行!”); }}/** * 妙計(jì)三:孫夫人斷后,擋住追兵 */public class BlockEnemy implements IStrategy { @Override public void operate() { System.out.println(“孫夫人斷后,擋住追兵”); }}public class ZhaoYun { /** * 趙云出場(chǎng)了,他根據(jù)諸葛亮給他的交代,依次拆開妙計(jì) * @param args */ public static void main(String[] args) { Context context; System.out.println(“———–剛剛到吳國(guó)的時(shí)候拆第一個(gè)————-“); context = new Context(new BackDoor()); context.operate(); System.out.println(“”); System.out.println(“———–劉備樂(lè)不思蜀了,拆第二個(gè)了————-“); context = new Context(new GivenGreenLight()); context.operate(); System.out.println(“”); System.out.println(“———–孫權(quán)的小兵追了,咋辦?拆第三個(gè) ————-“); context = new Context(new BlockEnemy()); context.operate(); System.out.println(“”); }}
注:本文創(chuàng)作思路源于《設(shè)計(jì)模式之禪》