回爐設(shè)計(jì)模式——策略模式

不要問我什么是策略模式谤逼,也不要問我策略模式的要素贵扰,關(guān)鍵點(diǎn)是什么?我希望這些問題流部,你能自己找到答案戚绕。當(dāng)然,最后我還是會講的枝冀。

這是我寫的第一個設(shè)計(jì)模式舞丛,所以耘子,避免枯燥乏味。我們先做一個小游戲吧球切。

我們設(shè)計(jì)一款冒險(xiǎn)動作的游戲谷誓,就叫他“拯救公主”吧,小時(shí)候玩過很多類似的游戲吨凑。就“抄襲”我們經(jīng)典“超級瑪麗”吧捍歪。

開場,我們的公主被惡魔抓走了鸵钝,糙臼,,需要勇士去營救恩商。

我們準(zhǔn)備進(jìn)入游戲了变逃,首先是選擇主角(馬里奧,路易基怠堪,庫巴(目前就只提供3個吧))揽乱,我們就選馬里奧吧。

然后研叫,馬里奧就踏上了營救公主的道路(此處省略一萬字)锤窑。

最后,馬里奧終于走到了關(guān)押公主的城堡嚷炉,但是,這里有3個強(qiáng)大的敵人(暫時(shí)就設(shè)計(jì)3個吧)探橱。他們申屹,是“怕火”,“怕水”隧膏,“怕電”哗讥,

講到這里,聰明的小伙伴肯定猜到胞枕,要打敗這三個敵人要分別用火杆煞,水,電了吧腐泻。

沒錯决乎,當(dāng)馬里奧對戰(zhàn)“怕火”的時(shí)候要用“火焰攻擊”,對戰(zhàn)“怕水”的時(shí)候要用“水攻擊”派桩,遇到“怕電”的時(shí)候构诚,要用“電攻擊”。

最后铆惑,由于馬里奧采用了正確的攻擊策略范嘱,所以送膳,馬里奧成功的救了公主,并和公主開心的在一起了丑蛤。

故事講完了叠聋,我們來設(shè)計(jì)程序怎么寫吧:

你可能會說,這個簡單:像下面這樣受裹,建立一個馬里奧類晒奕,他有三個方法:火攻擊,水攻擊名斟,電攻擊脑慧。就可以實(shí)現(xiàn)上面的“打敵人”游戲了。


我:那還有兩個角色怎么辦呢砰盐?

你:這個也簡單呀闷袒,我寫一個抽象類,馬里奧岩梳,路易基囊骤,庫巴都繼承這個類,然后冀值,把這3個方法放到抽象類就可以了:


我:嗯也物,這樣挺好的,每個具體角色都只需要實(shí)現(xiàn)role的方法列疗,就可以實(shí)現(xiàn)我們的需求了滑蚯,而且如果再加入新的角色,只需要繼承這個role就可以了抵栈。很棒哦告材,但是,如果我們加入一個新的角色“耀西”古劲,但是這個耀西不會火焰攻擊斥赋,卻多會一種”風(fēng)攻擊“,該怎么辦呢产艾?

你:疤剑。。闷堡。這個隘膘,還能有這種情況?

我:當(dāng)然缚窿,棘幸,那這個時(shí)候是不是要再改改?

你:那就這樣:把各種攻擊倦零,改為接口误续,實(shí)現(xiàn)一個接口吨悍,就擁有一種攻擊,這樣蹋嵌,就可以實(shí)現(xiàn)你說的那種情況了育瓜。


我:這樣,的確可以解決角色之間擁有不同攻擊手段的問題栽烂,那么又有問題了躏仇,如果,現(xiàn)在有幾十上百中攻擊手段腺办,而某些角色又擁有很多種攻擊手段焰手,那豈不是些角色,要實(shí)現(xiàn)很多接口怀喉,书妻,,這實(shí)在不太好吧躬拢。

你:那該怎么辦呀躲履?我實(shí)在沒辦法了。

我:我們可以這樣改:抽象父類Role種聊闯,定義一個攻擊手段的集合工猜,一個抽象攻擊方法,一個添加攻擊手段的方法菱蔬。

子類只需要實(shí)現(xiàn)攻擊方法篷帅。另外一邊,定義一個攻擊手段的接口汗销,然后犹褒,他有很多的具體實(shí)現(xiàn)。這樣就實(shí)現(xiàn)了一種很優(yōu)的解決方案弛针。

我們來試一下,馬里
奧會火焰攻擊,耀西會風(fēng)攻擊李皇,庫巴會水攻擊和電攻擊削茁。那么,就是這樣寫:

Attack fire = new Fire()

Attack water= new Water()

Attack wind= new Wind()

Attack elec= new Electric()

Role maliao = new Bowser()

maliao.addAttack(fire)

Role yaoxi= new Yoshi()

yaoxi.addAttack(wind)

庫巴就省略了掉房。

maliao.attack()

yaoxi.attack()

我:像這樣寫茧跋,就可以高度解耦攻擊手段和角色之間的關(guān)系依賴了。并且卓囚,攻擊手段之間可以相互替換瘾杭,突然有一天,馬里奧會風(fēng)攻擊了哪亿,那只需要把風(fēng)攻擊手段給他加上去就可以了粥烁,或者他不會攻擊了贤笆,那就把他的攻擊手段給去掉就可以了。

其實(shí)讨阻,策略模式核心思想就是行為替換(算法替換)芥永,把一堆變化的算法(行為)進(jìn)行分類封裝,形成一個算法族(行為族)钝吮,同一個算法族種的算法可以彼此替換埋涧,這就是策略模式的核心。

當(dāng)然奇瘦,你看我的這個策略模式棘催,和很多網(wǎng)上其他的解釋,例子可能會有不同耳标。因?yàn)槲沂窃谝粋€時(shí)間例子(問題)中去講的醇坝,所以,其實(shí)麻捻,這并不是只有策略模式纲仍,我也并不想跟你說什么是策略模式之類的,我只是想講策略模式的一種常用的用法贸毕,和對實(shí)際問題該怎么思考郑叠。

最后啰嗦幾句,設(shè)計(jì)模式明棍,是一種經(jīng)驗(yàn)乡革,思想,是解決問題的一種思路摊腋。一定是有一個什么樣的問題沸版,然后用什么方式(模式)解決,而不是兴蒸,因?yàn)橛幸粋€什么樣的模式视粮,所以我要這樣去寫。千萬不要本末倒置橙凳。

還有蕾殴,我有些地方?jīng)]有寫,也沒有講岛啸,希望你們能自己去思考钓觉,而不是,我全都告訴你坚踩,那樣并沒有什么好處荡灾。我寫這個系列也是希望可以通過一些例子,引導(dǎo)你去思考,而不是為了學(xué)設(shè)計(jì)模式而學(xué)設(shè)計(jì)模式批幌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末础锐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子逼裆,更是在濱河造成了極大的恐慌郁稍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胜宇,死亡現(xiàn)場離奇詭異耀怜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)桐愉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門财破,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人从诲,你說我怎么就攤上這事左痢。” “怎么了系洛?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵俊性,是天一觀的道長。 經(jīng)常有香客問我描扯,道長定页,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任绽诚,我火速辦了婚禮典徊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恩够。我一直安慰自己卒落,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布蜂桶。 她就那樣靜靜地躺著儡毕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扑媚。 梳的紋絲不亂的頭發(fā)上妥曲,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音钦购,去河邊找鬼。 笑死褂萧,一個胖子當(dāng)著我的面吹牛押桃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播导犹,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼唱凯,長吁一口氣:“原來是場噩夢啊……” “哼羡忘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磕昼,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤卷雕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后票从,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漫雕,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年峰鄙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浸间。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡吟榴,死狀恐怖魁蒜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吩翻,我是刑警寧澤兜看,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站狭瞎,受9級特大地震影響细移,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脚作,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一葫哗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧球涛,春花似錦劣针、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至从祝,卻和暖如春襟己,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牍陌。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工擎浴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毒涧。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓贮预,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仿吞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容