06_Strategy Pattern 策略模式
GoF 定義: 定義一個系列的演算法,然後封裝每個演算法,使得他們之間可以互換。策略模式使得演算法在客戶端之間可以獨立地變化。(Define a family of algorithms, encapsulate each one, and make them interchangeable. The strategy pattern lets the algorithm vary independently from client to client.)
進一步解釋:策略模式是把演算法封裝成相同的介面,然後在執行時按需動態呼叫。一旦有了統一介面,客戶端就可用用同一份程式碼處理不同的情況,要做的只是在此之前設定不同的演算法子類。
例如,有一個段子講的是:“一個標準的程式設計師在睡覺時候都會準備兩個杯子,一個是空的,一個裝滿了水。裝滿水的杯子為的是醒來之後口渴,空白杯子是為了萬一醒來之後不渴。”這位哥們一看就是學過設計模式的科班出身,把策略模式用到了生活中。
我們用程式碼表述這個情景:
import java.util.Random;
/**
* strategy pattern
*/
public class Main {
public static void main(String[] args) {
String[] conditionArray = {"Thirsty", "NotThirsty"};
// 例項化兩個演算法類
IPickCup whenThirsty = new PickCupWhenThirsty();
IPickCup whenNotThirsty = new PickCupWhenNotThirsty();
WakeUp wakeUp = new WakeUp();
for (int i = 0; i < 10; i++) {
// 迴圈10次,隨機生成口渴和不渴的情形
String condition = conditionArray[new Random().nextInt(2)];
System.out.println("\nTime "+ i + " I'm "+condition);
// 根據情況傳入不同的演算法
if (condition.equals("Thirsty")){
wakeUp.setPickCup(whenThirsty);
} else {
wakeUp.setPickCup(whenNotThirsty);
}
wakeUp.doRegular();
}
}
}
// 喝水動作的介面函式
abstract class IPickCup {
abstract void pickUpCup();
}
// 感覺口渴時
class PickCupWhenThirsty extends IPickCup {
@Override
void pickUpCup() {
System.out.println("Pick up the cup");
System.out.println("Drink...");
System.out.println("Put down the cup");
System.out.println("And continue go to sleep");
}
}
// 萬一不渴
class PickCupWhenNotThirsty extends IPickCup {
@Override
void pickUpCup() {
System.out.println("pick up the cup");
System.out.println("Put down the cup");
System.out.println("And continue go to sleep");
}
}
class WakeUp {
IPickCup pickCup = null;
// 在這裡動態載入不同的演算法(即渴不渴的情況)
void setPickCup(IPickCup pickCup) {
this.pickCup = pickCup;
}
// 策略模式可以使用同一份程式碼處理不同的情況
void doRegular() {
System.out.println("I am waking up");
pickCup.pickUpCup();
}
}
類圖:
輸出:
策略模式的關鍵在於實現具有統一介面的演算法類(這裡的杯子就是介面,因此就算沒有水,杯子還是要有的),然後用不同的演算法類處理不同的情形(口渴和不口渴)。在呼叫過程中,客戶端程式根據不同情形動態載入不同的演算法(WakeUp 類中的setPickCup()方法)。
相關文章
- 策略模式【Strategy Pattern】模式
- 設計模式之策略模式和狀態模式(strategy pattern & state pattern)設計模式
- 1/24 設計模式之策略設計模式 Strategy Pattern設計模式
- 代理模式(Proxy Pattern)模式
- 【大道模式】享元模式-FlyWeight Pattern模式
- composite pattern(組合模式)模式
- 裝飾模式 (Decorator Pattern)模式
- 建造者模式(Builder Pattern)模式UI
- 規格模式(Specification Pattern)模式
- 單例模式(Singleton Pattern)單例模式
- 設計模式--建造者模式(Builder Pattern)設計模式UI
- 設計模式--原型模式(Prototype Pattern)設計模式原型
- 設計模式--裝飾模式(Decorator Pattern)設計模式
- 設計模式-狀態模式(State Pattern)設計模式
- 設計模式-裝飾模式(Decorator Pattern)設計模式
- 設計模式之代理模式(proxy pattern)設計模式
- 介面卡模式(adapter pattern)模式APT
- 構建者模式(Builder pattern)模式UI
- C#設計模式——代理模式(Proxy Pattern)C#設計模式
- C++設計模式——命令模式(command pattern)C++設計模式
- 常用設計模式-單例模式(Singleton pattern)設計模式單例
- [Design Pattern With Go]設計模式-工廠模式Go設計模式
- 設計模式之單例模式(Singleton Pattern)設計模式單例
- Java中的代理模式(Proxy Pattern)Java模式
- 設計模式--單例(Singleton Pattern)設計模式單例
- 設計模式十: 生成器模式(Builder Pattern)設計模式UI
- 設計模式--抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 設計模式--工廠方法模式(Factory Method Pattern)設計模式
- 重識設計模式-建造者模式(Builder Pattern)設計模式UI
- C#設計模式-建造者模式(Builder Pattern)C#設計模式UI
- C#設計模式-原型模式(Prototype Pattern)C#設計模式原型
- 設計模式之介面卡模式(adapter pattern)設計模式APT
- 設計模式之裝飾器模式(decorator pattern)設計模式
- 設計模式之觀察者模式(Observer Pattern)設計模式Server
- 設計模式-抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 設計模式:命令模式(Command Pattern)及例項設計模式
- C#設計模式-外觀模式(Facade Pattern)C#設計模式
- PHP設計模式(一)—單例模式(Singleton Pattern)PHP設計模式單例