java設計模式之---策略模式

概念

Strategy模式也叫策略模式是行爲模式之一, 他對一系列算法加以封裝, 爲所有的算法定義一個抽象的算法接口, 並通過繼承該抽象算法接口對所有的算法加以封裝和實現,具體的算法選擇交由客戶端決定(策略). Strategy模式主要用來平滑的處理算法的切換

結構


Strategy: 策略(算法)的抽象
ConcreteStrategy: 各種策略(算法)的實現
Context: 策略的外部封裝類, 或者說策略的容器類. 根據不同的策略執行不同的行爲. 策略由外部環境決定


這種設計客戶只需要關心Context即可, 可以把Context 看成一個簡單的工廠, 持有一個抽象算法的引用, 算法的實現可以有無限多個

代碼

商家打折促銷策略
//商家促銷策略
public interface Strategy {
	public double cost(double money);
}

public class StrategyA implements Strategy {

	// 策略A: 八折
	@Override
	public double cost(double money) {
		return money * 0.8;
	}

}

public class StrategyB implements Strategy {

	// 策略B: 滿200返50
	@Override
	public double cost(double money) {
		if (money >= 200) {
			return money - 50;
		}
		return money;
	}

}
測試代碼
public class MainClass {
	public static void main(String[] args) {

		Context context = new Context(new StrategyA());
		// Context context = new Context(new StrategyB());
		System.out.println(context.cost(200));
	}
}

優點

1. 策略模式提供了管理相關算法族的辦法. 策略類的等級結構定義了一個算法或行爲族. 恰當的使用繼承可以把公共的代碼移到父類裏面, 從而避免重複的代碼
2. 策略模式提供了可以替換繼承關係的辦法. 繼承可以處理多種算法或行爲. 如果不是用策略模式, 那麼使用算法或行爲的環境類就可能會有一些子類, 每一個子類提供一個不同的算法或行爲. 但是, 這樣一來算法或行爲的使用者就和算法或行爲本身混在一起. 決定使用哪一種算法或採用哪一種行爲的邏輯和算法或行爲的邏輯混合在一起, 從而不可能再獨立演化. 繼承使得動態改變算法或行爲變得不可能
3. 使用策略模式可以避免使用多重條件轉移語句(if). 多重轉移語句不易維護, 他把採取哪一種算法或行爲的邏輯與算法或行爲的邏輯混在一起,統統列在一個多重轉移語句裏面, 比使用繼承的辦法還要原始和落後

缺點

1. 客戶端必須知道所有的策略類, 並自行決定使用哪一個策略類. 這就意味着客戶端必須理解這些算法的區別, 以便適時選擇恰當的算法類. 換言之,策略模式只適用於客戶端知道所有的算法或行爲的情況
2. 策略模式造成很多的策略類. 有時候可以通過把依賴於環境的狀態保存到客戶端裏面, 而將策略類設計成可共享的, 這樣策略類實例可以被不同的客戶端使用. 換言之, 可以使用享元模式來減少對象的數量








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章