【行為型】策略模式
阿新 • • 發佈:2021-12-22
一、策略模式
定義一族演算法類,將每個演算法分別封裝起來,讓它們可以互相替換。策略模式可以使演算法的變化獨立於使用它們的客戶端(這裡的客戶端代指使用演算法的程式碼)。
策略定義:
public interface Strategy { void algorithmInterface(); } public class ConcreteStrategyA implements Strategy { @Override public void algorithmInterface() { //具體的演算法... } } public class ConcreteStrategyB implementsStrategy { @Override public void algorithmInterface() { //具體的演算法... } }
策略建立:為了封裝建立邏輯,我們需要對客戶端程式碼遮蔽建立細節。我們可以把根據type建立策略的邏輯抽離出來,放到工廠類中。
針對無狀態的策略:使用Map
1 public class StrategyFactory { 2 private static final Map<String, Strategy> strategies = new HashMap<>(); 3 4 staticView Code{ 5 strategies.put("A", new ConcreteStrategyA()); 6 strategies.put("B", new ConcreteStrategyB()); 7 } 8 9 public static Strategy getStrategy(String type) { 10 if (type == null || type.isEmpty()) { 11 throw new IllegalArgumentException("type should not be empty."); 12 }13 return strategies.get(type); 14 } 15 }
針對有狀態的策略:
1 public class StrategyFactory { 2 public static Strategy getStrategy(String type) { 3 if (type == null || type.isEmpty()) { 4 throw new IllegalArgumentException("type should not be empty."); 5 } 6 7 if (type.equals("A")) { 8 return new ConcreteStrategyA(); 9 } else if (type.equals("B")) { 10 return new ConcreteStrategyB(); 11 } 12 13 return null; 14 } 15 }View Code
策略模式使用:
1、配置檔案指定策略名,然後通過工廠在動態時決定
2、直接程式碼指定具體策略
二、職責鏈模式
典型實現:Servlet的filter chain(addFilter、doFilter)、Spring Interceptor
三、狀態模式(不常用,適用狀態機)
狀態模式一般用來實現狀態機,而狀態機常用在遊戲、工作流引擎等系統開發中。不過,狀態機的實現方式有多種,除了狀態模式,比較常用的還有分支邏輯法和查表法。