【Java設計模式】· 策略模式(Strategy Pattern)

策略模式:


            1.策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。需要的時候可以靈活地調用方法,也可以對方法(策略)進行修改,客戶端調用方法時不需要知道這個方法是怎樣實現的。


        2.策略模式區別於訪問者模式,解釋器模式,狀態模式。

               訪問者模式裏面兩個對象(訪問者與被訪者)之間有相互調用函數,增加一個訪問者會比較困難(要連同被訪者的幾個重載函數一起創建,在被訪者類裏面也要增加相應的函數),在策略模式裏面只要增加一個策略類(並implements Strategy)就可以了。


               解釋器模式裏面,如四則運算,加法只是解決問題所用到的一條語句,解釋器模式根據問題將算法和參與運算的值組合成一個樹型結構,非葉子節點(NonterminalExpression)爲算法,葉子節點(TerminalExpression)爲參與運算的值,最後通過遍歷這顆樹求得問題的解


               狀態模式和策略模式非常相似,將“策略”的切換部分或全部交由“策略”自己處理,這就是狀態模式。

Context:環境類,客戶端通過它來調用策略方法

Strategy:策略接口

Concrete StategyA/B/C:具體策略類




                3.例子,調用3個方法(策略)


策略類接口,策略方法operate()

package pers.reus.model.strategy.impl;
//策略類接口
public interface Strategy {
	public void operate();
}

三個方法A,B,C

package pers.reus.model.strategy;

import pers.reus.model.strategy.impl.Strategy;

public class StrategyA implements Strategy{
	public void operate() {
		System.out.println("使用策略A");
	}
}


package pers.reus.model.strategy;

import pers.reus.model.strategy.impl.Strategy;

public class StrategyB implements Strategy{
	public void operate() {
		System.out.println("使用策略B");
	}
}

package pers.reus.model.strategy;

import pers.reus.model.strategy.impl.Strategy;

public class StrategyC implements Strategy{
	public void operate() {
		System.out.println("使用策略C");
	}
}

環境類Context。

package pers.reus.model.context;

import pers.reus.model.strategy.impl.Strategy;
//環境類
public class StrategyPatternContext {
	private Strategy strategy;  
    //構造函數,通過傳參判斷要使用哪個方法  
    public StrategyPatternContext(Strategy strategy){  
         this.strategy = strategy;  
    }  
    public void setStrategy(Strategy strategy){  
         this.strategy = strategy;  
    }  
    public void operate(){  
         this.strategy.operate();  
    }  
}

測試:

package pers.reus.model.client;

import pers.reus.model.context.StrategyPatternContext;
import pers.reus.model.strategy.StrategyA;
import pers.reus.model.strategy.StrategyB;
import pers.reus.model.strategy.StrategyC;

public class StrategyPatternClient {

	public static void main(String[] args) {
	    //聲明Context
	    StrategyPatternContext context; 
		
	    //講A,B,C三個策略分別放入Context
	    context = new StrategyPatternContext(new StrategyA());
	    context.operate();
	    
	    context = new StrategyPatternContext(new StrategyB());
	    context.operate();
	    
	    context = new StrategyPatternContext(new StrategyC());
	    context.operate();
	}

}

結果:

使用策略A
使用策略B
使用策略C


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