java設計模式–策略模式詳解

策略模式

策略模式(Strategy Pattern)屬於行為型模式,指對象有某個行為,但是在不同的場景中,該行為有不同的實現算法。用算法族分別封裝起來,實現同一個接口,讓他們之間可以互相替換,讓算法的變化獨立於使用算法的客戶。

  • 主要解決:在有多種算法相似的情況下,使用 if…else 所帶來的復雜和難以維護。
  • 如何解決:將這些算法封裝成一個一個的類,任意地替換。
  • 何時使用:一個系統有許多許多類,而區分它們的隻是他們直接的行為。

使用場景:

  • 如果在一個系統裡面有許多類,它們之間的區別僅在於它們的行為,那麼使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。
  • 一個系統需要動態地在幾種算法中選擇一種。
  • 如果一個對象有很多的行為,如果不用恰當的模式,這些行為就隻好使用多重的條件選擇語句來實現。
優點 缺點
算法可以自由切換 策略類會增多
避免使用多重條件判斷 所有策略類都需要對外暴露
擴展性良好

在這裡插入圖片描述

  • 環境類(Context):持有抽象策略類的引用,用來操作策略的上下文環境。
  • 抽象策略類(Strategy):策略的抽象類或接口,給出所需實現接口。
  • 具體策略類(ConcreteStrategy):具體的策略實現。

Demo

有幾種鵝:天鵝、野鵝、灰鵝,鵝有各種行為,如飛、遊泳、叫等。

假設天鵝灰鵝飛行能力一般,野鵝飛行能力優秀;天鵝野鵝遊泳能力一般,灰鵝遊泳能力優秀。

首先看第一種方法:

在這裡插入圖片描述

這種方法固然可以實現目的,但問題顯而易見,子類過多覆蓋父類方法,代碼未復用,耦合度很高。使用策略模式,簡單來說,就是封裝子類行為成接口,父類包含該接口即可。

在這裡插入圖片描述

代碼:

public interface FlyBehavior {
    void fly();
}
public class FlyGood implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飛行能力優秀");
    }
}
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()); //改變某個對象的行為
        greyGoose.flyBehavior.fly();
    }
}

運行結果:

在這裡插入圖片描述

總結

本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: