設計模式(二)策略模式2
看了武哥的策略模式,感覺真是易懂哈
策略模式在實際中使用的還是挺多的,先來看一個場景:某個市場人員接到單兒後的報價策略,保價策略很複雜,但是可以簡單做如下歸類:
新客戶小批量報價 新客戶大批量報價 老客戶小批量報價 老客戶大批量報價
具體選用哪個報價策略,這需要根據實際情況來確定,這時候採用策略模式即可解決這個問題。這個問題中,如果我們不採用策略模式會怎樣處理呢?很自然的會想到使用if判斷,或者switch…case…來解決,根據不同的使用者確定不同的報價。類似於如下的結構:
public double getPrice(String type, double price) { if(type.equals("新客戶小批量")) { // 處理報價邏輯 return price; } else if(type.equals("新客戶大批量")) { // 處理報價邏輯 return price; } //...... }
或者使用switch….case….,但是很明顯有個弊端,這個型別特別多,而且每個型別裡面還有自己的演算法,如果演算法比較複雜的話整個條件的控制程式碼會變得很長,難以維護。為了解決這個問題,我們可以使用策略模式。 策略模式:即對應於解決某一個問題的一個演算法族,允許使用者從該演算法族中人選個一個演算法解決某一問題,同時可以方便的更換演算法或者增加新的演算法,並且由客戶端決定呼叫哪個演算法,可以如下的示意圖: 首先有個策略的介面,然後不同的四個不同的策略分別實現這個介面中的方法,在這裡是報價的方法,然後定義一個上下文類,用來操作具體的具體的策略,客戶端只需要與這個上下文打交道即可,即只要將策略傳給上下文類,就可以執行相應的策略,後期如果需要修改或者新增,只需要修改具體的策略實現類或者新新增一個實現類即可,便於維護。下面來看下程式的實現。//策略介面
public interface Strategy {
public double getPrice(double standardPrice);
}
四個不同的策略實現類:
// 新客戶小批量 public class NewCustomerFewStrategy implements Strategy { @Override public double getPrice(double standardPrice) { System.out.println("新客戶小批量,不打折"); return standardPrice; } } // 新客戶大批量 public class NewCustomerManyStrategy implements Strategy { @Override public double getPrice(double standardPrice) { System.out.println("新客戶大批量,打九折"); return standardPrice * 0.9; } } // 老客戶小批量 public class OldCustomerFewStrategy implements Strategy { @Override public double getPrice(double standardPrice) { System.out.println("老客戶小批量,打八折"); return standardPrice * 0.8; } } // 老客戶大批量 public class OldCustomerManyStrategy implements Strategy { @Override public double getPrice(double standardPrice) { System.out.println("老客戶大批量,打八折"); return standardPrice * 0.7; } }
然後就是上下文類了:
/**
* @Description 負責和具體的策略互動,具體的演算法和直接的客戶端分離。
* @author Ni Shengwu
*
*/
public class Context {
private Strategy strategy;
// 通過構造方法注入具體的策略,如果用Spring,就可以直接使用@Resource來注入了
public Context(Strategy strategy) {
super();
this.strategy = strategy;
}
public void getPrice(double standardPrice) {
System.out.println("報價為:" + strategy.getPrice(standardPrice));
}
}
測試一下:
public class Client {
public static void main(String[] args) {
Strategy s1 = new OldCustomerManyStrategy();
Context ctx = new Context(s1); //通過構造方法注入策略
ctx.getPrice(1000);
}
}
輸出結果為:
老客戶大批量,打八折
報價為:700.0
在實際中,策略模式在spring中也有用到,通過註解@Resource就是使用該模式,注入哪個就使用哪個。 --------------------- 作者:eson_15 原文:https://blog.csdn.net/eson_15/article/details/52119001 版權宣告:本文為博主原創文章,轉載請附上博文連結!