策略模式-Strategy Pattern

解決問題

將算法按照策略或場景封裝起來,以方便按照不同的場景執(zhí)行不同的策略。它很好的解決了通過if...else 來決策行為而帶來的代碼和邏輯復(fù)雜性。

應(yīng)用場景

一個經(jīng)常被拿來舉例的場景是收銀員收銀場景:它需要根據(jù)不同的場景(是否為會員、有無促銷等)來決定計(jì)算方式,如果使用if..else將使得代碼復(fù)雜的無法維護(hù),這時我們就可以分場景來計(jì)算即可。

所以該策略的應(yīng)用場景即為:需要根據(jù)場景執(zhí)行不同的策略(該策略應(yīng)該具有一定的復(fù)雜性)

模式圖UML

image
  • Context:即場景,持有一個或多個策略

  • Strategy: 即策略,具有一個執(zhí)行策略的方法

  • ConcreteStrategy:具體策略

示例

舉一個實(shí)際工作中的例子吧。APP在改版時通常需要做ABTest,A/B策略展式的樣式會有所不同。

  • Strategy
public interface Strategy { 
    public void show(); 
} 
  • Concrete
public class StrategyA implements Strategy { 
    @Override 
    public void show() { 
        System.out.println("展示促銷"); 
    } 
}
public class StrategyB implements Strategy{ 
    @Override 
    public void show() { 
        System.out.println("展示廣告"); 
    } 
}
  • Context
@AllArgsConstructor 
public class Context { 
    private Strategy strategy; 
    // 可能還有其它信息 
     
    public void showPattern() { 
        strategy.show(); 
    } 
}
  • client
public class Client { 
    public static void main(String[] args) { 
        String a = "a";// getStrategy from rpc 
        Strategy strategy; 
        if (a.equals("a")) { 
            strategy = new StrategyA(); 
        } else { 
            strategy = new StrategyB(); 
        } 
 
        new Context(strategy).showPattern(); 
    } 
}

參考

https://en.wikipedia.org/wiki/Strategy_pattern

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容