策略模式屬於對象的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。老王最近接到一個工作,上級領導安排他對大家進行一次關於設計模式的科普培訓。小蔡被安排作為老王的助手,一起準備這次培訓。小蔡以前... ...
策略模式屬於對象的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。
老王最近接到一個工作,上級領導安排他對大家進行一次關於設計模式的科普培訓。小蔡被安排座位老王的助手,一起準備這次培訓。
小蔡以前從來不知道什麼叫做設計模式,一聽就感覺高深莫測,有一種不明覺厲的感覺。
於是小蔡問老王:“老王啊,什麼叫做設計模式呢?”
老王回答:“設計模式,簡單來將,就是一套經驗,一套總結,沒什麼玄乎的。不過學了設計模式之後,對我們未來的工作是大有好處的。”
小蔡接著問:“那你先給我講講唄,我作為助手,什麼都不知道,這讓別人指導了,可就丟臉了。”
老王說:“好啊, 那我們今天先來說說策略模式吧。策略模式屬於對象的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。”
小蔡兩眼直發愣:“老王,你說的都是些啥,火星語嗎?完全聽不懂。”
老王說:“先彆著急,剛只是跟你說了一下策略模式的定義,接下來給你舉一個例子,你就明白了。對了,你知道咱們公司人稱“冰雪美人”的程妹妹最喜歡吃什麼不?”
小蔡單手一輝說:“她啊。最喜歡吃火鍋,不過她的口味可是很挑剔的,咋的?你對她有意思?”
老王沒有瞧小蔡,接著說:“好的,她喜歡吃火鍋,而且口味挑剔。那好,我用策略模式來滿足她喜歡吃火鍋的要求。”
小蔡一下興奮起來:“吃個火鍋都能和設計模式聯繫起來?”
老王接著說:“假設公司里的張董想要追求程妹妹,想請程妹妹到家裡吃火鍋。張董得先請一個廚師,對吧?那麼我們就來定義一個介面,告訴張董什麼叫做廚師。”
//這是一個廚師
public interface Cook {
//是廚師就得會做火鍋
HotPot cook();
}
小蔡打趣道:“張董還不知道廚師是幹嘛的?需要我們告訴他嗎?”
老王白了小蔡一眼,接著說:“張董現在知道什麼是廚師了。於是張總按照這個標準到廚師學校去找廚師,到了廚師學校,他發現了三個廚師,一個四川廚師,一個北京廚師,一個潮汕廚師。”
//北京廚師
public class CookOfBeijing implements Cook {
//北京廚師做的就是北京火鍋
@Override
public HotPot cook() {
HotPotOfBeijing hotPot = new HotPotOfBeijing();
return hotPot;
}
}
//潮汕廚師
public class CookOfChaoshan implements Cook {
//潮汕廚師做的就是潮汕火鍋
@Override
public HotPot cook() {
HotPotOfChaoshan hotPot = new HotPotOfChaoshan();
return hotPot;
}
}
//四川廚師
public class CookOfSichuan implements Cook {
//四川廚師做的就是四川火鍋
@Override
public HotPot cook() {
HotPotOfSichuan hotPot = new HotPotOfSichuan();
return hotPot;
}
}
小蔡留著口水問:“原來火鍋也分地區的啊?那這些火鍋有什麼區別呢?”
老王習慣性的呷了一口茶後說:“彆著急,你不知道他們的區別,咱們張董也不知道呢,我們繼續來看看這些火鍋有些什麼區別和特點。”
//北京火鍋
public class HotPotOfBeijing extends HotPot {
//北京老火鍋,可是銅火鍋,以前皇帝都用這個。
public HotPotOfBeijing() {
super("銅火鍋啊~銅火鍋~");
}
}
//潮汕火鍋
public class HotPotOfChaoshan extends HotPot{
//潮汕的牛肉火鍋,味道鮮香棒
public HotPotOfChaoshan() {
super("吃牛肉啊~吃牛肉~");
}
}
//四川火鍋
public class HotPotOfSichuan extends HotPot{
//四川火鍋的特點是:麻辣燙
public HotPotOfSichuan() {
super("麻辣燙啊~麻辣燙~");
}
}
小蔡:“現在火鍋的特點知道了,廚師也有了,然後開始做火鍋了?”
老王:“廚師有了。火鍋知道了。但是還需要一個東西,才能做火鍋,那就是廚房,對吧?我們來看看廚房是什麼樣的。”
//廚房,做火鍋的地方
public class Kitchen {
//掌勺的主廚
private Cook cook;
//廚師進廚房了
public Kitchen(Cook cook) {
super();
this.cook = cook;
}
//開工,做一個火鍋出來
public HotPot cook(){
return cook.cook();
}
}
小蔡打斷了老王:“老王,現在廚師,廚房,火鍋全有了,聽得我肚子都餓了,但是我們要講的策略模式在哪裡呢?”
老王又呷了一口茶,說:“彆著急嘛,準備工作做好了,接下來我們就開始吃火鍋,哦,不對,應該是讓張董去追程妹妹,追程妹妹總得講點策略吧。這就是我們要講的策略模式了。”
//開始追求程妹妹
public class Chasing {
//追求活動
public static void main(String[] args) {
//叫來北京廚師
CookOfBeijing cookOfBeijing = new CookOfBeijing();
//讓北京廚師進廚房
Kitchen kitchen = new Kitchen(cookOfBeijing);
//做出北京火鍋
HotPot hotPot = kitchen.cook();
//問問程妹妹是否喜歡北京火鍋
//結果發現程妹妹不喜歡北京火鍋
//叫來潮汕廚師
CookOfChaoshan cookOfChaoshan = new CookOfChaoshan();
//讓潮汕廚師進廚房
kitchen = new Kitchen(cookOfChaoshan);
//做出潮汕火鍋
hotPot = kitchen.cook();
//問問程妹妹是否喜歡潮汕火鍋
//結果發現程妹妹不喜歡潮汕火鍋
//叫來四川廚師
CookOfSichuan cookOfSichuan = new CookOfSichuan();
//讓潮汕廚師進廚房
kitchen = new Kitchen(cookOfSichuan);
//做出潮汕火鍋
hotPot = kitchen.cook();
//問問程妹妹是否喜歡四川火鍋
//發現程妹妹很喜歡四川火鍋
//於是張董和程妹妹開始開心的吃火鍋
//一直吃到23:26
//然後出去散步,看午夜場電影………………
}
}
老王又呷了一口茶,說道:“小蔡,你看,這就是策略模式。首先定義一個介面,這就相當於是制定了一條策略,然後依照這個策略編寫不同的實現類,就相當於一條策略有不同的實施辦法。這個模式的優勢在於可以動態的改變對象的行為。再聚個例子,比如京東針對它的會員,有不同的會員演算法,比如金牌會員演算法,銀牌會員演算法,銅牌會員演算法。這就是針對會員演算法這一個固定的策略,有了不同的實現。”
小蔡投來羡慕的目光:“老王,你真是太有才了。這樣的例子,我能懂,不過我還有點迷糊,不知道策略模式該如何去做,你能幫我歸納一下嗎?”
老王:“可以啊。策略模式主要有3個角色,1.環境類(Context):就是剛纔說道的廚房。2. 抽象策略類(Strategy):這個是廚師介面。具體策略類(ConcreteStrategy):這就是那三個廚師。我們用一個圖來表示,能夠更加清晰易懂。”
小蔡:“老王,我發現另一個事兒。”
老王:“什麼事兒?”
小蔡:“我肚子餓了。今天你得請我吃火鍋。”
老王:“好好好,走嘛,今天晚上我們吃火鍋。吃完之後,我們也去看一場電影哇?”
小蔡:“那得看火鍋好不好吃了。哈哈”
更多內容,正在趕來,敬請關註“小蔡和老王的技術日常”。
PS:小蔡和老王的技術日常,已經建立QQ群,QQ群號:261434596,歡迎加入。。