设计模式:策略模式(Strategy)
生活随笔
收集整理的這篇文章主要介紹了
设计模式:策略模式(Strategy)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
定???義:它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化,
???????????不會影響到使用算法的客戶。
示例:商場收銀系統,實現正常收費、滿300返100、打8折.......等不同收費方式
效果圖:
結構圖:
HTML代碼:
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"><title>設計模式:策略模式</title><style type="text/css">table{width: 300px;height: 250px;border-collapse: collapse;}table, tr, td{border: 1px solid gray;}</style> </head> <body><form id="form1" runat="server"><table><thead><tr><td colspan="3">商場收銀軟件</td></tr></thead><tr><td>單價:</td><td><asp:TextBox runat="server" ID="txtPrice"></asp:TextBox></td><td><asp:Button runat="server" ID="btnOK" Text="確定" onclick="btnOK_Click" /></td></tr><tr><td>數量:</td><td><asp:TextBox runat="server" ID="txtNumber"></asp:TextBox></td><td><asp:Button runat="server" ID="Button1" Text="重置" onclick="Button1_Click" /></td></tr><tr><td>計算方式:</td><td><asp:DropDownList runat="server" ID="ddlCashType"><asp:ListItem Selected="True">正常收費</asp:ListItem><asp:ListItem>打8折</asp:ListItem><asp:ListItem>滿300返100</asp:ListItem></asp:DropDownList></td><td></td></tr><tr><td colspan="3"><asp:TextBox runat="server" ID=txtMsg TextMode="MultiLine" Rows="8" Columns="30"></asp:TextBox></td></tr><tr><td>總計:</td><td><asp:Label runat="server" ID="lblTotal"></asp:Label></td><td></td></tr></table></form> </body> </html> View CodeCashContext類:
public class CashContext{CashSuper cs = null;public CashContext(string type){switch (type){case "正常收費":cs = new CashNormal();break;case "滿300返100":cs = new CashReturn("300", "100");break;case "打8折":cs = new CashRebate("0.8");break;}}public double GetResult(double money){return cs.AcceptCash(money);}} View CodeCashSuper類:?
/// <summary>/// 現金收費抽象類/// </summary>public abstract class CashSuper{public abstract double AcceptCash(double money);} View CodeCashNormal類:??
/// <summary>/// 正常收費子類/// </summary>public class CashNormal : CashSuper{public override double AcceptCash(double money){return money;}} View CodeCashRebate類:
/// <summary>/// 打折收費子類/// </summary>public class CashRebate : CashSuper{private double moneyRebate = 1d;public CashRebate(string moneyRebate){this.moneyRebate = double.Parse(moneyRebate);}public override double AcceptCash(double money){return money * moneyRebate;}} View CodeCashReturn類:
/// <summary>/// 返利收費子類/// </summary>public class CashReturn : CashSuper{private double moneyCondition = 0.0d;private double moneyReturn = 0.0d;public CashReturn(string moneyCondition, string moneyReturn){this.moneyCondition = double.Parse(moneyCondition);this.moneyReturn = double.Parse(moneyReturn);}public override double AcceptCash(double money){double result = money;if (money >= moneyCondition){result = money -Math.Floor(money / moneyCondition) * moneyReturn;}return result;}} View Code客戶端實現:
protected void btnOK_Click(object sender, EventArgs e){CashContext csuper = new CashContext(ddlCashType.SelectedValue);string totalPrice = csuper.GetResult(Convert.ToDouble(txtNumber.Text)*Convert.ToDouble(txtPrice.Text)).ToString();lblTotal.Text = totalPrice;} View Code?
策略模式和簡單工廠模式區別:
用途不一樣,名字就有區別,一把斧頭用來砍人就叫兇器,用來砍材就叫伐木斧,用來劈門就叫消防斧,這些模式的名字都是根據具體使用時的場景,聯系了現實里某樣東西或某種習慣而取得,所以很相似的模式行為有不同叫法很正常。
工廠模式:根據你給出的目的來生產不同用途的斧子,例如要砍人,那么工廠生產砍人斧子,要伐木就生產伐木斧子。
????????????? ?即根據你給出一些屬性來生產不同行為的一類對象返回給你。
關注對象創建
策略模式:用工廠生產的斧子來做對應的事情,例如用砍人的斧子來砍人,用伐木的斧子來伐木。
?????????????? 即根據你給出對應的對象來執行對應的方法。
關注行為的選擇
?
?
轉載于:https://www.cnblogs.com/qianxingdewoniu/p/3540781.html
總結
以上是生活随笔為你收集整理的设计模式:策略模式(Strategy)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2014年,马上要上班啦,希望一切顺利
- 下一篇: Model compatibility