您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Java中如何實(shí)現(xiàn)策略模式的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
這里設(shè)計(jì)了一個(gè)有關(guān)足球的場(chǎng)景,在進(jìn)攻當(dāng)中暫分為傳球和射門兩個(gè)動(dòng)作。
最開始你可能會(huì)這樣想,設(shè)計(jì)一個(gè)抽象類(Attact),傳球和射門分別定義好,子類會(huì)有一些他們個(gè)性的東西。比如球員號(hào)碼,教練名稱等等。
后來(lái)你發(fā)現(xiàn)傳球和射門可能會(huì)分好多種,傳球可分為短傳和長(zhǎng)傳,射門又分為巴蒂式射門和因扎吉式的搶點(diǎn)。這樣就不能將他們都寫在這個(gè)抽象類(Attact)中,比如有的隊(duì)員就是一個(gè)工兵型的(像AC米蘭的加圖索)他不停的搶斷傳球,很少參與到射門當(dāng)中來(lái)。這樣再定義若干個(gè)子類來(lái)繼承(Attact)就不能滿足需求。
我們可以把諸如傳球和射門等動(dòng)作抽象出來(lái)。組合到該抽象類中,只需在其中調(diào)用具體的方法即可。
像這樣來(lái)定義:(其中Passable和Shootable為行為接口)
package strategy; /** * @author edison * @date 2009-9-24 */ public abstract class Attact { Passable pass; Shootable shoot; public abstract void display(); public void ownPass(){ pass.action(); } public void ownShoot(){ shoot.action(); } public void setPass(Passable pass) { this.pass = pass; } public void setShoot(Shootable shoot) { this.shoot = shoot; } }
這里我們采用了策略模式,將傳球和射門這一類動(dòng)作定義為標(biāo)準(zhǔn),封裝起來(lái),讓他們之間可以互相的組合和替換,這樣有效的使具體操作和實(shí)現(xiàn)分離。
上面一段話也可以這樣說(shuō):
策略模式定義了算法族,分別封裝起來(lái),讓它們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶。
得到幾個(gè)設(shè)計(jì)原則:
1.找到應(yīng)用中可能變化之處,把它們獨(dú)立初以來(lái),不要和那些不需要變化的代碼混在一起。
2.針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程。
3.多用組合,少用繼承。
類圖:
以上就是策略模式的一個(gè)簡(jiǎn)單案例。
感謝各位的閱讀!關(guān)于“Java中如何實(shí)現(xiàn)策略模式”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。