<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
所謂策略其實就是做一件事情有很多很多的方法,比如說一個商場要搞促銷,促銷的方式有可能有很多:打折啊,滿100返50啊、積分等等之類的。這種不同的促銷方式在我們系統中表示就是一個一個的策略,並且策略是可以隨時更換的,這個時候在設計系統時就可以使用策略模式。
商場有可能會更換或追加新的促銷模式,也就是策略存在調整,也就是會更改以前的程式碼,為了滿足開閉原則,這時就要使用抽象類和介面,這裡我們偏向使用介面。在介面裡面定義策略的方法,根據不同的情況編寫不同的實現類,實現不同的策略,策略模式比較適用於演演算法經常變化的情況,比如計算工資的方式、出行方式的選擇等等。
如圖所示,我們先定義策略的介面(Promotion),然後在這個策略介面裡定義策略的方法(GetPrice()),接著我們定義了兩種具體的策略(Discount打折)和(MoneyBack返現)。
策略模式會專門有一個上下文物件(PromotionContext)專門管理策略類,並且上下文物件和策略介面之間是聚合的關係,也就是整體和部分的關係,因此在上下文物件裡應該儲存一個促銷型別的參照,另外上下文物件裡一般會有一些方便使用者端呼叫的方法,如GetPrice()。使用者端程式可以通過上下文物件得到價格,這個GetPrice()裡會根據不同的策略,執行不同的策略方法。
如果使用者端不想使用上下文中定義的預設的策略,也可以去修改策略類,因為上下文中有一個ChangePromotion()的方法,使用者端主要使用上下文物件,如果需要修改策略,他還要依賴於具體的策略物件。
1、策略介面:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 策略模式 { /* 策略介面 */ public interface IPromotion { /// <summary> /// 根據原價和策略計算新價格 /// </summary> /// <param name="originPrice">原價</param> /// <returns></returns> double GetPrice(double originPrice); } }
2、Discount打折策略類
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 策略模式 { /// <summary> /// 打折策略類 /// </summary> public class Discount :IPromotion { public double GetPrice(double originPrice) { Console.WriteLine("打八折:"); return originPrice * 0.8; } } }
3、MoneyBack返現類
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 策略模式 { /* 返現策略類:滿100返50的策略 */ class MoneyBack :IPromotion { public double GetPrice(double originPrice) { Console.WriteLine("滿100返50"); return originPrice - (int)originPrice / 100 * 50; } } }
4、策略上下文類
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 策略模式 { /* 策略上下文,為客戶選擇合適的策略 */ public class PromotionContext { private IPromotion p = null; public PromotionContext(IPromotion p) { this.p = p; } public double GetPrice(double originPrice) { // 預設策略 if (this.p == null) { this.p = new Discount(); } return this.p.GetPrice(originPrice); } /// <summary> /// 更改策略的方法 /// </summary> /// <param name="p"></param> public void ChangePromotion(IPromotion p) { this.p = p; } } }
5、主程式呼叫
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 策略模式 { class Program { static void Main(string[] args) { // 預設策略:打八折的策略 PromotionContext pc = new PromotionContext(null); Console.WriteLine(pc.GetPrice(200)) ; // 更改策略:滿100返50的策略 pc.ChangePromotion(new MoneyBack()); Console.WriteLine(pc.GetPrice(155.9)); Console.ReadKey(); } } }
程式碼下載地址:點選下載
到此這篇關於C#設計模式之策略模式的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45