策略模式(Strategy)定義了一系列的算法,並將每個算法封裝起來,並且使它們還能夠相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。java
類型:形爲型模式 git
順口溜:中訪策備迭 觀模命狀職解github
package com.amosli.dp.behavior.strategy; public abstract class Strategy { public abstract void algorithmInterface(); } package com.amosli.dp.behavior.strategy; public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void ContextInterface() { strategy.algorithmInterface(); } } package com.amosli.dp.behavior.strategy; public class ConcreteStrategyA extends Strategy { @Override public void algorithmInterface() { System.out.println("this is strategy a..."); } } package com.amosli.dp.behavior.strategy; public class ConcreteStrategyB extends Strategy { @Override public void algorithmInterface() { System.out.println("this is strategy B..."); } } package com.amosli.dp.behavior.strategy; public class ConcreteStrategyC extends Strategy { @Override public void algorithmInterface() { System.out.println("this is strategy C..."); } } package com.amosli.dp.behavior.strategy; public class Client { public static void main(String[] args) { Context context = new Context(new ConcreteStrategyA()); context.ContextInterface(); } }
一、 策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行爲族。恰當使用繼承能夠把公共的代碼轉移到父類裏面,從而避免重複的代碼。算法
二、 策略模式提供了能夠替換繼承關係的辦法。繼承能夠處理多種算法或行爲。若是不是用策略模式,那麼使用算法或行爲的環境類就可能會有一些子類,每個子類提供一個不一樣的算法或行爲。可是,這樣一來算法或行爲的使用者就和算法或行爲自己混在一塊兒。決定使用哪種算法或採起哪種行爲的邏輯就和算法或行爲的邏輯混合在一塊兒,從而不可能再獨立演化。繼承使得動態改變算法或行爲變得不可能。ide
三、 使用策略模式能夠避免使用多重條件轉移語句。多重轉移語句不易維護,它把採起哪種算法或採起哪種行爲的邏輯與算法或行爲的邏輯混合在一塊兒,通通列在一個多重轉移語句裏面,比使用繼承的辦法還要原始和落後。this
一、客戶端必須知道全部的策略類,並自行決定使用哪個策略類。這就意味着客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用於客戶端知道全部的算法或行爲的狀況。spa
二、 策略模式形成不少的策略類,每一個具體策略類都會產生一個新類。有時候能夠經過把依賴於環境的狀態保存到客戶端裏面,而將策略類設計成可共享的,這樣策略類實例能夠被不一樣客戶端使用。換言之,可使用享元模式來減小對象的數量。設計
本系列文章源碼地址,https://github.com/amosli/dp 歡迎Fork & Star !!code