1. 程式人生 > >二、策略模式

二、策略模式

java 結合 clas 自己 xtend concrete 維護 @override bstr

1 策略模式實際上就是應對有各種策略(實現方法)的需求。比如超市促銷,有多種多樣的促銷策略,這時候就要想到策略模式,策略模式一般會配合工廠模式使用。

代碼如下:

package com.biao.strategy.original;
/**
 * 
 * @author biao
 * 策略模式:定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化,不會影響到使用
 *        算法的客戶。
 *       
 * 應用:商場各種促銷方案。
 * 
 * 記憶方法:一個超類的算法家族+一個context容器。容器內通過構造方法註入一個超類的引用,容器內寫一個方法,實現註入的對象去調用具體的算法。
 
*/ public class StrategyDemo { public static void main(String[] args) { //缺點:此處為邏輯部分,邏輯應該和界面分離,這裏相當於判斷多種方法,應該放到邏輯處理中,綜合簡單工廠模式, //將判斷創建哪一種對象的邏輯放入具體類中處理。 Context contextA = new Context(new ConcreteStrategyA()); Context contextB = new Context(new ConcreteStrategyB()); contextA.contextInterface(); contextB.contextInterface(); } }
//抽象算法類,算法接口用於不同的實現方式 abstract class Strategy{ abstract public void AlgorithmInterface(); } //具體算法1 class ConcreteStrategyA extends Strategy{ @Override public void AlgorithmInterface() { // TODO Auto-generated method stub System.out.println("算法一的實現方案"); } } //具體算法2 class
ConcreteStrategyB extends Strategy{ @Override public void AlgorithmInterface() { // TODO Auto-generated method stub System.out.println("算法二的實現方案"); } } //Context類,用來維護一個Strategy,然後調用該具體類的算法。其實就是通過構造方法註入。 class Context{ Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public void contextInterface(){ strategy.AlgorithmInterface(); } }

如上demo中,主函數中創建容器(Context)的時候,需要用戶自己註入不同的對象,實際相當於用戶去判斷傳入什麽對象,這個判斷邏輯通過工廠的方法生成。(實際並沒變化,容器中任然維護一個策略超類的引用)代碼如下:

package com.biao.strategy.simplefactory;

/**
 * 
 * @author biao
 * 工廠模式和策略模式的簡單結合。策略模式用於封裝一些算法,供客戶端調用。
 * 但是具體創建哪一個策略,是邏輯判斷部分,利用工廠模式的多態,生成不同算法的
 * 對象,然後調用該對象的算法。
 */
public class StrategyFactoryDemo {
	public static void main(String[] args) {
		Context contextA = new Context("模式A");
		Context contextB = new Context("模式B");
		
		contextA.contextInterface();
		contextB.contextInterface();
	}
}
//抽象算法類,算法接口用於不同的實現方式
abstract class Strategy{
	abstract public void AlgorithmInterface();
}

//具體算法1
class ConcreteStrategyA extends Strategy{

	@Override
	public void AlgorithmInterface() {
		// TODO Auto-generated method stub
		System.out.println("算法一的實現方案");
	}
	
}
//具體算法2
class ConcreteStrategyB extends Strategy{
	
	@Override
	public void AlgorithmInterface() {
		// TODO Auto-generated method stub
		System.out.println("算法二的實現方案");
	}
}

//Context類,用來維護一個Strategy,然後調用該具體類的算法。
class Context{
	Strategy strategy;
	public Context(String flag){
		switch(flag){
		case "模式A":
			strategy = new ConcreteStrategyA();
			break;
		case "模式B":
			strategy = new ConcreteStrategyB();
			break;
		}
	}
	public void contextInterface(){
		strategy.AlgorithmInterface();
	}
}



二、策略模式