注:本文中的 引用實例 皆為引用《您的設(shè)計模式》上實例
策略模式
-
1、什么是策略模式挽霉?
- 第一點:定義一系列算法
- 第二點:每一個算法單獨封裝
- 第三點:每一個算法都是可以相互替換
- 第四點:客戶端調(diào)用變化算法(獨立變化)
-
2劈猿、應(yīng)用場景听隐?(抽象概念)
- 第一個方面:針對同一類型問題多種處理方式贰谣,僅僅只是具體的行為有差別
- 第二個方面:需要安全的封裝同一類型的操作
- 第三個方面:處于同一個抽象類有多個子類八秃,而有需要使用if-else或者switch進行選擇具體的子類
-
3垃它、策略模式角色鲜屏?
- 角色一:策略接口
- 角色二:策略實現(xiàn)類
- 角色三:策略上下文(可以忽略)
引用實例
??劉備要到江東娶老婆了烹看,走之前諸葛亮給趙云(伴郎)三個錦囊妙計,說是按天機拆開解決棘手問題墙歪, 嘿听系,還別說,真是解決了大問題虹菲,搞到最后是周瑜陪了夫人又折兵呀靠胜,那咱們先看看這個場景是什么樣子 的。
??先說這個場景中的要素:三個妙計毕源,一個錦囊浪漠,一個趙云,妙計是小亮同志給的霎褐,妙計是放置在錦囊 里址愿,俗稱就是錦囊妙計嘛,那趙云就是一個干活的人冻璃,從錦囊中取出妙計响谓,執(zhí)行,然后獲勝省艳,用 JAVA 程序 怎么表現(xiàn)這個呢?我們先看類圖:
策略模式
三個妙計是同一類型的東東娘纷,那咱就寫個接口:
/**
* 首先定一個策略接口,這是諸葛亮老人家給趙云的三個錦囊妙計的接口 *
*/
public interface IStrategy { //每個錦囊妙計都是一個可執(zhí)行的算法
public void operate();
}
然后再寫三個實現(xiàn)類跋炕,有三個妙計嘛:
/**
* 找喬國老幫忙赖晶,使孫權(quán)不能殺劉備
*/
public class BackDoor implements IStrategy {
public void operate() {
System.out.println("找喬國老幫忙,讓吳國太給孫權(quán)施加壓力");
}
}
/**
* 求吳國太開個綠燈
*/
public class GivenGreenLight implements IStrategy {
public void operate() {
System.out.println("求吳國太開個綠燈,放行!");
}
}
/**
* 孫夫人斷后辐烂,擋住追兵
*/
public class BlockEnemy implements IStrategy {
public void operate() {
System.out.println("孫夫人斷后遏插,擋住追兵");
}
}
好了,大家看看纠修,三個妙計是有了胳嘲,那需要有個地方放這些妙計呀,放錦囊呀:
/**
* 計謀有了扣草,那還要有錦囊
*/
public class Context {
//構(gòu)造函數(shù)胎围,你要使用那個妙計
private IStrategy straegy;
public Context(IStrategy strategy){
this.straegy = strategy;
}
//使用計謀了,看我出招了
public void operate(){
this.straegy.operate();
}
}
??然后就是趙云雄赳赳的揣著三個錦囊德召,拉著已步入老年行列的白魂、還想著娶純情少女的、色迷迷的劉老 爺子去入贅了上岗,嗨福荸,還別說,小亮的三個妙計還真是不錯肴掷,瞅瞅:
public class ZhaoYun {
/**
* 趙云出場了敬锐,他根據(jù)諸葛亮給他的交代背传,依次拆開妙計
*/
public static void main(String[] args) {
Context context;
//剛剛到吳國的時候拆第一個
System.out.println("-----------剛剛到吳國的時候拆第一個-------------");
context = new Context(new BackDoor()); //拿到妙計
context.operate(); //拆開執(zhí)行
System.out.println("\n\n\n\n\n\n\n\n");
//劉備樂不思蜀了,拆第二個了
System.out.println("-----------劉備樂不思蜀了台夺,拆第二個了-------------");
context = new Context(new GivenGreenLight());
context.operate(); //執(zhí)行了第二個錦囊了
System.out.println("\n\n\n\n\n\n\n\n");
//孫權(quán)的小兵追了径玖,咋辦?拆第三個
System.out.println("-----------孫權(quán)的小兵追了,咋辦?拆第三個 -------------");
context = new Context(new BlockEnemy());
context.operate(); //孫夫人退兵
System.out.println("\n\n\n\n\n\n\n\n");
}
}
??就這三招颤介,搞的周郎是“陪了夫人又折兵”呀!這就是策略模式梳星,高內(nèi)聚低耦合的特點也表現(xiàn)出來了, 還有一個就是擴展性滚朵,也就是 OCP 原則冤灾,策略類可以繼續(xù)增加下去,只要修改 Context.java 就可以了辕近,這 個不多說了韵吨,自己領(lǐng)會吧。
我實現(xiàn)的Swift與OC實例代碼:
Swift:https://github.com/Flonger/StrategyPattern-Swift
OC:https://github.com/Flonger/StrategyPatternOC