策略模式(Strategy Pattern):定義一系列算法,將每個算法封裝起來,並讓它們能夠相互替換。策略模式讓算法獨立於使用它的客戶而變化,也稱爲政策模式(Policy)。 算法
在軟件開發過程當中,咱們經常會遇到這樣一種狀況:爲了實現某一種功能,咱們有多種實現方式,算法或者策略。好比對於查找算法來講,要提供多種查找算法,能夠將這些算法寫到一個類中,在該類中提供多個方法,每個方法對應一個具體的查找算法;固然也能夠將這些查找算法封裝在一個統一的方法中,經過if…else…或者case等條件判斷語句來進行選擇。若是須要增長一種新的查找算法,須要修改封裝算法類的源代碼;更換查找算法,也須要修改客戶端調用代碼。在這個算法類中封裝了大量查找算法,該類代碼將較複雜,維護較爲困難。若是咱們將這些策略包含在客戶端,這種作法更不可取,將致使客戶端程序龐大並且難以維護,若是存在大量可供選擇的算法時問題將變得更加嚴重。安全
下面來看一下策略模式的具體組成bash
For example數據結構
首先咱們須要定義咱們的抽象策略,將接口、公共代碼部分封裝在這裏ide
public interface Strategy {
public void operater();
}
複製代碼
而後咱們根據具體需求,去實現對應策略類函數
public class strateyA implements Strategy {
@Override
public void operater() {
// 策略 A 的執行方式
}
}
public class strateyB implements Strategy {
@Override
public void operater() {
// 策略 B 的執行方式
}
}
複製代碼
在經過環境類去進行二次封裝,從中能夠看到能夠經過構建函數來決定使用哪一條策略,也能夠經過 setStrategy 方法,去改變因此使用的策略,而且執行的爲對應策略中所實現的方法。ui
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void operater() {
this.strategy.operater();
}
}
複製代碼
接下來看一下調用者的具體調用this
public class Client {
public static void main(String[] args) {
Context context;
// 我想使用第一個策略
context = new Context(new strateyA());
context.operater();
// 條件改變了,我想使用第二個策略
context.setStrategy(new strateyB());
context.operater();
}
}
複製代碼
策略模式主要就是爲了分離算法和使用,使系統有很好的拓展性spa
策略模式是一種簡單經常使用的模式,咱們在進行開發的時候,會常常有意無心地使用它,通常來講,策略模式不會單獨使用,跟模版方法模式、工廠模式等混合使用的狀況比較多。code
Article by 夏風_Me