Java設計模式之九(策略模式)

一、什麼是策略模式

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


二、策略模式的結構


三、策略模式的角色和職責

Strategy:策略(算法)抽象。


ConcreteStrategy     各種策略(算法)的具體實現。


Context     策略的外部封裝類,或者說策略的容器類。根據不同策略執行不同的行爲。策略由外部環境決定。


四、策略模式的優點

它的優點有:


1. 策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行爲族。恰當使用繼承可以把公共的代碼移到父類裏面,從而避免重複的代碼。


2. 策略模式提供了可以替換繼承關係的辦法。繼承可以處理多種算法或行爲。如果不是用策略模式,那麼使用算法或行爲的環境類就可能會有一些子類,每一個子類提供一個不同的算法或行爲。但是,這樣一來算法或行爲的使用者就和算法或行爲本身混在一起。決定使用哪一種算法或採取哪一種行爲的邏輯就和算法或行爲的邏輯混合在一起,從而不可能再獨立演化。繼承使得動態改變算法或行爲變得不可能。


3. 使用策略模式可以避免使用多重條件轉移語句。多重轉移語句不易維護,它把採取哪一種算法或採取哪一種行爲的邏輯與算法或行爲的邏輯混合在一起,統統列在一個多重轉移語句裏面,比使用繼承的辦法還要原始和落後。


代碼實現:

策略抽象類:

package com.qianyan.strategy;

public interface Strategy {

	//獲取實際花費
	public double cost(double num);
}

策略實現類:

package com.qianyan.strategy.impl;

import com.qianyan.strategy.Strategy;

public class StrategyA implements Strategy{

	/**
	 * 打八折
	 */
	@Override
	public double cost(double num) {
		return num * 0.8;
	}

}

package com.qianyan.strategy.impl;

import com.qianyan.strategy.Strategy;

public class StrategyB implements Strategy {

	/**
	 * 滿200減50
	 */
	@Override
	public double cost(double num) {
		if(num >= 200)
			return num - 50;
		return num;
	}

}

策略的外部封裝類(包含了對策略的引用):

package com.qianyan.context;

import com.qianyan.strategy.Strategy;

/**
 * 策略者
 * @author hadoop
 *
 */
public class Context {

	private Strategy strategy;
	
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}
	
	/**
	 * 計算實際花費
	 * @return
	 */
	public double cost(double num){
		return this.strategy.cost(num);
	}
}

測試類:

import com.qianyan.context.Context;
import com.qianyan.strategy.impl.StrategyA;

/**
 * 顧客
 * @author hadoop
 *
 */
public class Customer {

	public static void main(String[] args) {
		double num = 200;
		Context context = new Context(new StrategyA());
		double realCost = context.cost(num);
		System.out.println("實際花費:" + realCost + "元");
	}
}

測試結果:

實際花費:160.0元


發佈了66 篇原創文章 · 獲贊 20 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章