設(shè)計(jì)模式之策略模式(行為型)

一、模式定義

策略模式:定義一系列算法,然后將每一個(gè)算法封裝起來(lái),并將它們可以互相替換。也就是將一系列算法封裝到一系列策略類里面。策略模式是一種對(duì)象行為型模式。策略模式符合“開(kāi)閉原則“

Strategy Pattern: Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

二、模式角色

  • Context :環(huán)境類
  • Strategy:抽象策略類
  • ConcreteStrategy:具體策略類

三、簡(jiǎn)單實(shí)例

不用策略模式的情況:

public class Context
{
    ……
    public void method(String type)  
    {
        ......
        if(type == "strategyA")
        {
            //算法A
        }
        else if(type == "strategyB")
        {
            //算法B
        }
        else if(type == "strategyC")
        {
            //算法C
        }
        ......
    }
    ……
} 

抽象策略類:

public abstract class AbstractStrategy
{
    public abstract void method();  
} 

具體策略類:

public class ConcreteStrategyA extends AbstractStrategy
{
    public void method()
    {
        //算法A
    }
} 

環(huán)境類:

public class Context
{
    private AbstractStrategy strategy;
    public void setStrategy(AbstractStrategy strategy)
    {
        this.strategy= strategy;
    }
    public void method()
    {
        strategy.method();
    }
} 

客戶端調(diào)用:

Context context = new Context();
AbstractStrategy strategy;
strategy = new ConcreteStrategyA();
context.setStrategy(strategy);
context.method();

四、策略模式和狀態(tài)模式對(duì)比

相同點(diǎn):

  • 策略模式和狀態(tài)模式都是屬于行為型設(shè)計(jì)模式,也同樣是對(duì)象行為型設(shè)計(jì)模式,非類行為型設(shè)計(jì)模式。

  • 策略模式和狀態(tài)模式有點(diǎn)類似,都符合”閉合原則“

  • 兩個(gè)設(shè)計(jì)模式都可以用于減少代碼大量的if...else

不同點(diǎn):

  • 具體使用策略模式還是狀態(tài)模式,可以通過(guò)環(huán)境類的狀態(tài)而定,有很多狀態(tài)的話,就使用狀態(tài)模式。

  • 使用策略模式時(shí),環(huán)境類需要選擇一個(gè)確定的策略類,也就是客戶端調(diào)時(shí)需要關(guān)心具體狀態(tài),根據(jù)需要調(diào)用;而狀態(tài)模式是不需要的,在狀態(tài)模式里,環(huán)境類是要放在一個(gè)具體狀態(tài)中的,也就是根據(jù)環(huán)境類的狀態(tài)改變進(jìn)行調(diào)用狀態(tài)類的算法

對(duì)狀態(tài)模式不是很熟悉,可以參考我以前寫(xiě)的一篇博客
https://blog.csdn.net/u014427391/article/details/85219470

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容