策略模式:指的是對象具備某個行爲,但是在不同的場景中,該行爲有不同的實現算法。
策略模式使用的就是面向對象的繼承和多態機制,從而實現同一行爲在不同場景下具備不同實現。
策略模式本質:分離算法,選擇實現。
主要解決
在有多種算法相似的情況下,使用 if...else 或 switch...case 所帶來的複雜性和臃腫性。
優點
1)算法多樣性,且具備自由切換功能;
2)有效避免多重條件判斷,增強了封裝性,簡化了操作,降低出錯概率;
3)擴展性良好,策略類遵頊 里氏替換原則,可以很方便地進行策略擴展;
使用場景
1、針對同一類型問題,有多種處理方式,每一種都能獨立解決問題;
2、算法需要自由切換的場景;
3、需要屏蔽算法規則的場景;
策略模式的通用 UML 類圖(如何畫類圖?類名,方法名,接口,類與類之間的關係)
從 UML 類圖中,我們可以看到,策略模式 主要包含三種角色:
1)上下文角色(Context):用來操作策略的上下文環境,屏蔽高層模塊(客戶端)對策略,算法的直接訪問,封裝可能存在的變化;
2)抽象策略角色(Strategy):規定策略或算法的行爲; 接口
3)具體策略角色(ConcreteStrategy):具體的策略或算法實現; 實現類
抽象策略類,具體策略實現。
public static void main(String[] args) {
//選擇一個具體策略
IStrategy strategy = new ConcreteStrategyA();
//來一個上下文環境
Context context = new Context(strategy);
//客戶端直接讓上下文環境執行算法
context.algorithm();
}
class Context {
private IStrategy mStrategy;
public Context(IStrategy strategy) {
this.mStrategy = strategy;
}
public void algorithm() {
this.mStrategy.algorithm();
}
}
策略模式中的上下文環境(Context),其職責本來是隔離客戶端與策略類的耦合,讓客戶端完全與上下文環境溝通,無需關係具體策略。