您好,登錄后才能下訂單哦!
小編給大家分享一下java設(shè)計(jì)模式中策略模式的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
策略模式(Strategy Pattern)屬于行為型模式,指對(duì)象有某個(gè)行為,但是在不同的場景中,該行為有不同的實(shí)現(xiàn)算法。用算法族分別封裝起來,實(shí)現(xiàn)同一個(gè)接口,讓他們之間可以互相替換,讓算法的變化獨(dú)立于使用算法的客戶。
主要解決:在有多種算法相似的情況下,使用 if…else 所帶來的復(fù)雜和難以維護(hù)。
如何解決:將這些算法封裝成一個(gè)一個(gè)的類,任意地替換。
何時(shí)使用:一個(gè)系統(tǒng)有許多許多類,而區(qū)分它們的只是他們直接的行為。
使用場景:
如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。
一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。
如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)。
優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|
算法可以自由切換 | 策略類會(huì)增多 |
避免使用多重條件判斷 | 所有策略類都需要對(duì)外暴露 |
擴(kuò)展性良好 |
環(huán)境類(Context):持有抽象策略類的引用,用來操作策略的上下文環(huán)境。
抽象策略類(Strategy):策略的抽象類或接口,給出所需實(shí)現(xiàn)接口。
具體策略類(ConcreteStrategy):具體的策略實(shí)現(xiàn)。
有幾種鵝:天鵝、野鵝、灰鵝,鵝有各種行為,如飛、游泳、叫等。
假設(shè)天鵝灰鵝飛行能力一般,野鵝飛行能力優(yōu)秀;天鵝野鵝游泳能力一般,灰鵝游泳能力優(yōu)秀。
首先看第一種方法:
這種方法固然可以實(shí)現(xiàn)目的,但問題顯而易見,子類過多覆蓋父類方法,代碼未復(fù)用,耦合度很高。使用策略模式,簡單來說,就是封裝子類行為成接口,父類包含該接口即可。
public interface FlyBehavior { void fly(); } public class FlyGood implements FlyBehavior { @Override public void fly() { System.out.println("飛行能力優(yōu)秀"); } } public class FlyNormal implements FlyBehavior { @Override public void fly() { System.out.println("飛行能力一般"); } }
public interface SwimBehavior { void swim(); } public class SwimGood implements SwimBehavior { @Override public void swim() { System.out.println("游得好"); } } public class SwimNormal implements SwimBehavior { @Override public void swim() { System.out.println("游得一般"); } }
public abstract class Goose { //策略接口 FlyBehavior flyBehavior; SwimBehavior swimBehavior; //其他屬性等... public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } public void setSwimBehavior(SwimBehavior swimBehavior) { this.swimBehavior = swimBehavior; } } public class Swan extends Goose{ public Swan() { flyBehavior=new FlyNormal(); swimBehavior=new SwimNormal(); } } public class WildGoose extends Goose{ public WildGoose() { flyBehavior=new FlyGood(); swimBehavior=new SwimNormal(); } } public class GreyGoose extends Goose{ public GreyGoose() { flyBehavior=new FlyNormal(); swimBehavior=new SwimGood(); } }
public class Client { public static void main(String[] args) { Swan swan=new Swan(); swan.flyBehavior.fly(); WildGoose wildGoose=new WildGoose(); wildGoose.swimBehavior.swim(); GreyGoose greyGoose=new GreyGoose(); greyGoose.flyBehavior.fly(); greyGoose.setFlyBehavior(new FlyGood()); //改變某個(gè)對(duì)象的行為 greyGoose.flyBehavior.fly(); } }
運(yùn)行結(jié)果:
看完了這篇文章,相信你對(duì)“java設(shè)計(jì)模式中策略模式的示例分析”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。