策略模式范例:有關(guān)足球的場景
你了解策略模式么?如果你對足球很熟悉,那么看了下面的介紹后,你大概會同樣熟悉策略模式了。
這里設(shè)計了一個有關(guān)足球的場景,在進(jìn)攻當(dāng)中暫分為傳球和射門兩個動作。
最開始你可能會這樣想,設(shè)計一個抽象類(Attact),傳球和射門分別定義好,子類會有一些他們個性的東西。比如球員號碼,教練名稱等等。
后來你發(fā)現(xiàn)傳球和射門可能會分好多種,傳球可分為短傳和長傳,射門又分為巴蒂式射門和因扎吉式的搶點。這樣就不能將他們都寫在這個抽象類(Attact)中,比如有的隊員就是一個工兵型的(像AC米蘭的加圖索)他不停的搶斷傳球,很少參與到射門當(dāng)中來。這樣再定義若干個子類來繼承(Attact)就不能滿足需求。
我們可以把諸如傳球和射門等動作抽象出來。組合到該抽象類中,只需在其中調(diào)用具體的方法即可。
像這樣來定義:(其中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;
- }
- }
這里我們采用了策略模式,將傳球和射門這一類動作定義為標(biāo)準(zhǔn),封裝起來,讓他們之間可以互相的組合和替換,這樣有效的使具體操作和實現(xiàn)分離。
上面一段話也可以這樣說:
策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。
得到幾個設(shè)計原則:
1.找到應(yīng)用中可能變化之處,把它們獨立初以來,不要和那些不需要變化的代碼混在一起。
2.針對接口編程,而不是針對實現(xiàn)編程。
3.多用組合,少用繼承。
類圖:
以上就是策略模式的一個簡單案例。
【編輯推薦】