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.總結
策略模式的重心不是如何實現演算法,而是如何組織、呼叫這些演算法,從而讓程式結構更靈活,具有更好的維護性和擴充套件性。
上述只是一些簡單的實現,想研究的更深一點,還需要繼續學習。