1. 程式人生 > >java設計模式--策略模式

java設計模式--策略模式

1.策略模式的定義

策略模式屬於物件的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。
  策略模式是對演算法的包裝,是把使用演算法的責任和演算法本身分割開來,委派給不同的物件管理。策略模式通常把一個系列的演算法包裝到一系列的策略類裡面,作為一個抽象策略類的子類。用一句話來說,就是:“準備一組演算法,並將每一個演算法封裝起來,使得它們可以互換”。下面是UML圖:

 這個模式涉及到三個角色:

  1.環境(Context)角色:持有一個Strategy的引用。

  2.抽象策略(Strategy)角色:這是一個抽象角色,通常由一個介面或抽象類實現。此角色給出所有的具體策略類所需的介面。

  3.具體策略(ConcreteStrategy)角色:包裝了相關的演算法或行為。

下面舉一個圖書館對圖書進行打折的例子:

       行為1:普通成員打九折;

       行為2:vip打八折;

       行為3:高階vip打七折; 

首先把策略的方式抽象出來,如圖程式碼:

public interface LibraryStategy {

	/**
	 * 圖書館對圖書對會有進行打折
	 * 普通成員打9折
	 * vip打8折
	 * 高階vip打7折
	 */
	public double saleBook(double price);

}

其次,把具體的行為具體到每個類中,實現抽象策略。使其成為具體的策略,這就符合定義中將每一個演算法封裝到具有共同介面的獨立的類中,程式碼如下:

//普通成員
public class Ordinarymembers implements LibraryStategy{

	@Override
	public double saleBook(double price) {
		return price*0.9;
	}
	
}
//會員
public class Member implements LibraryStategy{

	@Override
	public double saleBook(double price) {
		return price*0.8;
	}
}
//高階會員
public class Seniormember implements LibraryStategy{

	@Override
	public double saleBook(double price) {
		return price*0.7;
	}

}

最後,建立一個環境角色:價格,並且引用一個策略。程式碼如下:

public class Price {

	private LibraryStategy stategy;
	
	public Price(LibraryStategy ls){
		this.stategy = ls;
	}
	/**
	 * 對圖書進行大者  
	 * @param price圖書的原價
	 * @return
	 */
	public double quote(double price){
		return stategy.saleBook(price);
	}
}

測試類,只寫了一個,如下:

public class StategyTest {

	public static void main(String[] args) {
		//建立策略使用的物件
		LibraryStategy ls = new Member();
		//建立環境
		Price price = new Price(ls);
		//計算價格
		System.out.println(price.quote(50));
		
	}
		
}

從上述的例子可一個看出,將每一個演算法封裝到具有共同介面的獨立的類中,具體選用哪一個演算法和行為是由客戶端決定的。

2.策略模式的有點和缺點

優點: 1、演算法可以自由切換。 2、避免使用多重條件判斷。 3、擴充套件性良好。

缺點: 1、策略類會增多。 2、所有策略類都需要對外暴露。

3.總結

  策略模式的重心不是如何實現演算法,而是如何組織、呼叫這些演算法,從而讓程式結構更靈活,具有更好的維護性和擴充套件性。

上述只是一些簡單的實現,想研究的更深一點,還需要繼續學習。