記錄大話設計的學習。大話設計模式pdf分享:https://pan.baidu.com/s/11h9x-4RffXydf3GFH5_y7g 提取碼:x5c3 。 上一篇通過超市優惠結賬的例子學習了演算法的封裝和產生實例的簡單工廠。這一篇在簡單工廠上繼續加工,讓它變成一種策略模式。 每一種優惠演算法都是一 ...
記錄大話設計的學習。大話設計模式pdf分享:https://pan.baidu.com/s/11h9x-4RffXydf3GFH5_y7g 提取碼:x5c3 。
上一篇通過超市優惠結賬的例子學習了演算法的封裝和產生實例的簡單工廠。這一篇在簡單工廠上繼續加工,讓它變成一種策略模式。
每一種優惠演算法都是一個具體的策略,它們抽象出來一個共同的策略就是返回結賬數額。通過CashContext創建實例,調用策略,簡化了使用演算法類和演算法類之間的耦合。在這裡客戶端不同知道具體使用了哪種策略,甚至是結賬金額是否通過了幾種策略的混合計算(舉例:傳入"滿900減100;8折",就使用了CashRebate和CashReturn)。
using System; namespace ConsoleApp4 { class Program { public static void Main(string[] args) { var cashContext = new CashContext("8折"); var result = cashContext.GetResult(900); } } public class CashContext { CashSuper cashSuper; public CashContext(string type) { switch (type) { case "滿300減50": cashSuper = new CashReturn(300d, 50d); break; case "8折": cashSuper = new CashRebate(0.8d); break; default: cashSuper = new CashNormal(); break; } } public double GetResult(double money) { return cashSuper.AcceptCash(money); } } public abstract class CashSuper { public abstract double AcceptCash(double money); } public class CashNormal : CashSuper { public override double AcceptCash(double money) { return money; } } public class CashRebate : CashSuper { private double rebate; public CashRebate(double rebate) { this.rebate = rebate; } public override double AcceptCash(double money) { return money * rebate; } } public class CashReturn : CashSuper { private double moneyCondition; private double moneyReturn; public CashReturn(double condition, double @return) { moneyCondition = condition; moneyReturn = @return; } public override double AcceptCash(double money) { if (money >= moneyCondition) { return money - ((money / moneyCondition) * moneyReturn); } else { return money; } } } }