什麼是策略模式 策略是我們在處理問題是所採用的步驟方法。如我要過年回家,方式有飛機、火車,汽車等,這幾種方式就是策略。 再比如我們商城要搞一個活動,給用戶生成一批優惠券,5折,7折,免單等,這些方法也是策略。 一個策略模式的例子: 模擬一個銷售給客戶報價的業務場景。我們銷售人員對不同的客戶制定不同的 ...
什麼是策略模式
策略是我們在處理問題是所採用的步驟方法。如我要過年回家,方式有飛機、火車,汽車等,這幾種方式就是策略。
再比如我們商城要搞一個活動,給用戶生成一批優惠券,5折,7折,免單等,這些方法也是策略。
一個策略模式的例子:
模擬一個銷售給客戶報價的業務場景。我們銷售人員對不同的客戶制定不同的報價。
普通客戶----不打折
一星客戶----9折
二星客戶----8折
三星客戶--- 7折
如果不採用策略模式大概處理方式如下:
public double getPrice(String type, double price){ if(type.equals("普通客戶")){ System.out.println("不打折,原價"); return price; }else if(type.equals(“一星客戶")){ return price*0.9; }else if(type.equals(“二星客戶")){ return price*0.8; }else if(type.equals(“三星客戶")){ return price*0.7; } return price; }
簡單粗暴,非常容易。但一但類型較多,業務處理複雜,流程長時,或者要增加業務時,整個代碼控制會難以維護。
採用策略模式能將這類問題很好處理,將每個分支問題都生成一個業務子類,具體用哪個子類就根據業務選擇。
採用策略模式:
/** * 抽象策略對象 */ public interface Stratgey { double getPrice(double price); }
/** * 普通客戶 不打折 */ public class NewCustomerStrategy implements Stratgey { @Override public double getPrice(double price) { System.out.println("普通客戶不打折"); return price; } }
/** * 一級客戶 9折 */ public class LeaveOneCustomerStrategy implements Stratgey { @Override public double getPrice(double price) { System.out.println("一級客戶9折"); return price; } }
/** * 二級客戶8折 */ public class LeaveTwoCustomerStrategy implements Stratgey { @Override public double getPrice(double price) { System.out.println("二級客戶8折"); return price; } }
/** * 三級客戶7折 */ public class LeaveThreeCustomerStrategy implements Stratgey { @Override public double getPrice(double price) { System.out.println("三級客戶7折"); return price; } }
再來一個管理策略對象的類
/** * 負責和具體策略類交互 *實現演算法和客戶端分離 */ public class Context { //當前的策略對象 private Stratgey stratge; public Context(Stratgey stratge) { this.stratge = stratge; } public void printPrice(double s){ stratge.getPrice(s); } }
public class Client {
public static void main(String[] args) {
//不同的策略
Stratgey stratge = new NewCustomerStrategy();
Stratgey one = new LeaveOneCustomerStrategy();
Stratgey two = new LeaveTwoCustomerStrategy();
Stratgey three = new LeaveThreeCustomerStrategy();
//註入具體的策略
Context context1 = new Context(stratge);
context1.printPrice(998);
Context context2 = new Context(one);
context2.printPrice(998);
Context context3 = new Context(two);
context3.printPrice(998);
}
}
當對應不同的客戶時,就註入不同的銷售策略。
策略模式將不同的演算法封裝成一個對象,這些不同的演算法從一個抽象類或者一個介面中派生出來,客戶端持有一個抽象的策略的引用,這樣客戶端就能動態的切換不同的策略。
和工廠模式區別在於策略模式自己實現業務處理過程,工廠模式在於所有業務交由工廠方法處理。