大話設計模式筆記(二)——商品促銷 策略模式
阿新 • • 發佈:2019-01-07
第二章商品促銷——策略模式
需求:商品價格計算,並增加折扣條件
工廠模式UML圖
在工廠模式中,呼叫端程式碼會通過折扣工廠類生成折扣物件,折扣物件呼叫折扣方法。這裡關聯了兩個類,工廠類和抽象折扣類。
策略模式UML圖
在策略模式中,會在策略環境類的構造器中完成折扣類的初始話,並在策略環境的實現方法呼叫折扣類的折扣演算法。這樣呼叫類只會關聯策略環境類。
簡單工廠模式需要的是生成的物件,所以在客戶端程式碼中會存在工廠類和生成類,而策略模式關注的是相應演算法,它並不關注演算法類物件,所以在客戶端程式碼中只會存在context環境類。這樣降低程式碼耦合度。
程式碼
Context
public class SaleContext { private SaleStrategy saleStrategy = null; public SaleContext(String saleSelector) { switch (saleSelector) { case "打9折": this.saleStrategy = new PercentSaleStrategy(0.9); break; case "打8折": this.saleStrategy = new PercentSaleStrategy(0.8); break; case "滿300減100": this.saleStrategy = new FullSendSaleStrategy(300, 100); break; default: this.saleStrategy = new NormalStrategy(); break; } } public double contextInterface(double money) { return saleStrategy.getSaleMoney(money); } }
SaleStrategy
abstract class SaleStrategy {
public abstract double getSaleMoney(double money);
}
PercentSaleStrategy(折扣促銷)
class PercentSaleStrategy extends SaleStrategy { private double pecent = 0.0d; public PercentSaleStrategy(double pecent) { this.pecent = pecent; } @Override public double getSaleMoney(double money) { return money * pecent; } }
FullSendSaleStrategy(滿減促銷)
class FullSendSaleStrategy extends SaleStrategy { private double fullMoney = 0.0d; private double sendMonty = 0.0d; public FullSendSaleStrategy(double fullMoney, double sendMonty) { this.fullMoney = fullMoney; this.sendMonty = sendMonty; } @Override public double getSaleMoney(double money) { return money > fullMoney ? (money - sendMonty) : money; } }
總結
策略模式是定義了一系列演算法,這些演算法從層次上實現相同的功能,最好析取出演算法層,可以減少演算法之間和呼叫演算法的耦合。
在實際工作中,當聽到需求中包含在不同時間應用不同業務規則,就可以考慮使用策略模式。
設計模式的核心思想就是對介面程式設計,封裝變化。
應用場景
只要在分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式。