設計模式之策略模式(行為型)
阿新 • • 發佈:2019-01-01
一、模式定義
策略模式:定義一系列演算法,然後將每一個演算法封裝起來,並將它們可以互相替換。也就是將一系列演算法封裝到一系列策略類裡面。策略模式是一種物件行為型模式。策略模式符合“開閉原則“
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