不要問我什么是策略模式谤逼,也不要問我策略模式的要素贵扰,關(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ì)模式批幌。