1. 程式人生 > 其它 >設計模式22-策略模式(Strategy)

設計模式22-策略模式(Strategy)

策略模式的重點在於其實現可以去感知隨意替換,根據不同的場景呼叫不同的實現。

設計模式22-策略模式(Strategy)

概述

策略模式的重點在於其實現可以去感知隨意替換,根據不同的場景呼叫不同的實現。

優點

  • 演算法可以自由切換。
  • 免使用多重條件判斷。
  • 擴充套件性良好。

缺點

  • 策略類膨脹。
  • 所有策略類都需要對外暴露。

簡單實現

JDK實現

策略模式需要設計一個介面,為一系列策略模式實現類提供統一的方法對外提供呼叫。

interface Strategy {
    /**
     * print message
     *
     * @param message message 
     */
    void print(String message);
}

通過不同的實現提供不同的業務邏輯。

public class NormalStrategy implements Strategy {
    @Override
    public void print(String message) {
        System.out.println(message);
    }
}
public class ErrorStrategy implements Strategy {
    @Override
    public void print(String message) {
        System.err.println(message);
    }
}

在不同的場景中,通過呼叫不同的實現類來完成不同的業務邏輯。

public class DesignPattenTest {
    @Test
    public void strategyDesignPattern() {
        String message = "this is a message";
        Strategy printStrategy = new NormalStrategy();
        printStrategy.print(message);
        printStrategy = new ErrorStrategy();
        printStrategy.print(message);
    }
}

原始碼解析

和狀態模式的比較

  • 策略模式封裝了業務邏輯,業務邏輯之間是解耦的;狀態模式將業務邏輯封裝到了狀態中,狀態之間存在切換的關係,切換操作可以在上下文或狀態自身內部進行。
  • 策略模式根據不同的業務場景切換不同的業務邏輯;狀態模式通過在同一場景中設定不同的狀態來呼叫不同的業務邏輯。
  • 策略模式的業務邏輯增刪不影響其他已有的業務邏輯;狀態模式的狀態增刪需要修改其他的狀態實現中的切換狀態邏輯。
  • 策略模式可以直接被 Client 呼叫,狀態模式必須通過一個有狀態的 Model 來被 Client 呼叫。