前言
通俗點理解就是,解決一個問題,有多種辦法策略。就像你追女孩子,通常的策略就是請吃飯、看電影、送花、噓寒問暖等,這些就是不同的策略,都實現追女孩子這個方法,你想先送花還是先請吃飯,都由你自己決定,也可以隨意切換。
概念
策略模式屬于對象的行為模式。其用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化。
策略模式的結構

策略模式的結構
策略模式的三個角色
Strategy(抽象策略角色):
通常由一個接口或抽象類實現。此角色定義了所有的具體策略類的公共接口。
ConcreteStrategy(具體策略角色):
實現了抽象策略類,包裝了相關的算法或行為。
Context(上下文角色):
上層訪問策略的入口,它持有抽象策略角色Strategy的引用。
代碼
抽象策略角色
package com.java.design.strategy;
/**
* 抽象策略角色:價格策略
*
* @author liyongfu
*/
public interface PriceStrategy {
/**
* 獲取購買價
*
* @param price 原價
* @return
*/
double getPrice(double price);
}
package com.java.design.strategy;
/**
* 具體策略角色:普通購買少量價
*
* @author liyongfu
*/
public class CommonFewPriceStrategy implements PriceStrategy {
/**
* 獲取購買價
*
* @param price 原價
* @return
*/
@Override
public double getPrice(double price) {
return price;
}
}
package com.java.design.strategy;
/**
* 具體策略角色:普通團購價
*
* @author liyongfu
*/
public class CommonManyPriceStrategy implements PriceStrategy {
/**
* 獲取購買價
*
* @param price 原價
* @return
*/
@Override
public double getPrice(double price) {
return price * 0.99;
}
}
package com.java.design.strategy;
/**
* 具體策略角色:會員少量價
*
* @author liyongfu
*/
public class MemberFewPriceStrategy implements PriceStrategy {
/**
* 獲取購買價
*
* @param price 原價
* @return
*/
@Override
public double getPrice(double price) {
return price * 0.98;
}
}
package com.java.design.strategy;
/**
* 具體策略角色:會員團購價
*
* @author liyongfu
*/
public class MemberManyPriceStrategy implements PriceStrategy {
/**
* 獲取購買價
*
* @param price 原價
* @return
*/
@Override
public double getPrice(double price) {
return price * 0.97;
}
}
package com.java.design.strategy;
/**
* 上下文角色Context
*
* @author liyongfu
*/
public class PriceContext {
/**
* 價格策略
**/
private PriceStrategy strategy;
public PriceContext(PriceStrategy strategy) {
this.strategy = strategy;
}
/**
* 獲取購買價
* @param price 原價
* @return
*/
public double getPrice(double price) {
return strategy.getPrice(price);
}
}
客戶端
package com.java.design.strategy;
/**
* 客戶端
* @author liyongfu
*/
public class StrategyTest {
public static void main(String[] args) {
PriceStrategy strategy = new MemberManyPriceStrategy();
PriceContext context = new PriceContext(strategy);
double price = context.getPrice(1000);
System.out.println(price);
}
}
策略模式的優(yōu)點
策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行為族。恰當使用繼承可以把公共的代碼移到父類里面,從而避免代碼重復。
使用策略模式可以避免使用多重條件(if-else)語句。多重條件語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統(tǒng)統(tǒng)列在一個多重條件語句里面,比使用繼承的辦法還要原始和落后。
策略模式的缺點
客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時選擇恰當的算法類。換言之,策略模式只適用于客戶端知道算法或行為的情況。
由于策略模式把每個具體的策略實現都單獨封裝成為類,如果備選的策略很多的話,那么對象的數目就會很可觀。
源碼實例
// TODO
項目實戰(zhàn)
// TODO