1. 程式人生 > 其它 >【行為型】策略模式

【行為型】策略模式

一、策略模式

定義一族演算法類,將每個演算法分別封裝起來,讓它們可以互相替換。策略模式可以使演算法的變化獨立於使用它們的客戶端(這裡的客戶端代指使用演算法的程式碼)。

策略定義:

public interface Strategy {
  void algorithmInterface();
}

public class ConcreteStrategyA implements Strategy {
  @Override
  public void  algorithmInterface() {
    //具體的演算法...
  }
}

public class ConcreteStrategyB implements
Strategy { @Override public void algorithmInterface() { //具體的演算法... } }

策略建立:為了封裝建立邏輯,我們需要對客戶端程式碼遮蔽建立細節。我們可以把根據type建立策略的邏輯抽離出來,放到工廠類中。

針對無狀態的策略:使用Map

 1 public class StrategyFactory {
 2   private static final Map<String, Strategy> strategies = new HashMap<>();
 3 
 4   static
{ 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 }
View Code

針對有狀態的策略:

 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


三、狀態模式(不常用,適用狀態機)

狀態模式一般用來實現狀態機,而狀態機常用在遊戲、工作流引擎等系統開發中。不過,狀態機的實現方式有多種,除了狀態模式,比較常用的還有分支邏輯法和查表法。