一、模式定義
策略模式:定義一系列算法,然后將每一個(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