一、模式定義
策略模式:定義一系列算法,然后將每一個算法封裝起來,并將它們可以互相替換。也就是將一系列算法封裝到一系列策略類里面。策略模式是一種對象行為型模式。策略模式符合“開閉原則“
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