1. 程式人生 > >設計模式之策略模式(行為型)

設計模式之策略模式(行為型)

一、模式定義

策略模式:定義一系列演算法,然後將每一個演算法封裝起來,並將它們可以互相替換。也就是將一系列演算法封裝到一系列策略類裡面。策略模式是一種物件行為型模式。策略模式符合“開閉原則“

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 :環境類
  • Strategy:抽象策略類
  • ConcreteStrategy:具體策略類

三、簡單例項

不用策略模式的情況:

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
    }
} 

環境類:

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

客戶端呼叫:

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

四、策略模式和狀態模式對比

相同點:

  • 策略模式和狀態模式都是屬於行為型設計模式,也同樣是物件行為型設計模式,非類行為型設計模式。

  • 策略模式和狀態模式有點類似,都符合”閉合原則“

  • 兩個設計模式都可以用於減少程式碼大量的if...else

不同點:

  • 具體使用策略模式還是狀態模式,可以通過環境類的狀態而定,有很多狀態的話,就使用狀態模式。

  • 使用策略模式時,環境類需要選擇一個確定的策略類,也就是客戶端調時需要關心具體狀態,根據需要呼叫;而狀態模式是不需要的,在狀態模式裡,環境類是要放在一個具體狀態中的,也就是根據環境類的狀態改變進行呼叫狀態類的演算法

對狀態模式不是很熟悉,可以參考我以前寫的一篇部落格
https://blog.csdn.net/u014427391/article/details/85219470