设计模式学习---策略模式
最近在看"Head First 設(shè)計模式"這本書,便想將自己所學(xué)的記錄下來以加深理解,文中肯定有許多不足之處,請各位前輩們指出.
什么是設(shè)計模式
設(shè)計模式并不是某種開發(fā)語言中的工具,而是我們處理問題時的一種體現(xiàn),平時在工作我們也總是會使用設(shè)計模式,在工作時我們會碰到各種問題,然后我們通過思考,總結(jié).得到出自己的一套處理問題的經(jīng)驗,或許我們并不知道什么是設(shè)計模式,但是對于某種問題我們已經(jīng)有了一套解決方案,然后通過觀看它人的代碼會發(fā)現(xiàn)別人處理這類問題與自己總結(jié)的相同,其實設(shè)計模式就是如此,它是前輩們通過大量的經(jīng)驗總結(jié)了出了一套程序設(shè)計思想,然后通過記錄和分享,于是出現(xiàn)了現(xiàn)在編程中的圣經(jīng)-----23種設(shè)計模式.也就是說設(shè)計模式其實并不神秘,但是它卻如此的重要
注:此處所說的問題是代碼中設(shè)計的問題,并不是功能需求問題,例如代碼的緊耦合
策略模式介紹
下面來說一下第一個設(shè)計模式:策略模式,策略模式是一個極其簡單的模式,但也是一個極其常用的模式,下面以一個極其簡單的例子介紹策略模式
現(xiàn)在要為一家商場設(shè)計一個促銷功能,不過現(xiàn)在并不知道具體的促銷需求,我們只需將促銷需求設(shè)計出來,然后在后期進行添加具體的促銷策略,于是我們快速的完成了這個類的第一版
注:這是一個簡單例子,只為闡述策略模式.
這一個簡單的類型便是第一版的商品類的促銷功能,但是在這里有一個巨大的問題,就是促銷策略的改變使得我們就必須更改其代碼.這并符合我們的設(shè)計理念,我們觀察代碼可以得知在這個功能中促銷是一個可變的部分,而我們可以將可變的部分進行分離,現(xiàn)在我們來更改一下代碼
// 商品類class Goods{//促銷類引用public DiscountStrategyClass DiscountStrategyClass { get; set; }// 商品名稱public string GoodsName { get; set; }// 商品價格public decimal GoodsPrice { get; set; }// 促銷方法public void Discount(){//調(diào)用促銷類的促銷方法DiscountStrategyClass.Discount();//Console.WriteLine("這是促銷方法,目前無促銷");}}// 促銷類class DiscountStrategyClass{// 促銷方法public void Discount(){Console.WriteLine("這是促銷方法,目前無促銷");}}上面就是我們將促銷方法分離后的代碼,我創(chuàng)建了一個促銷類,然后在商品類內(nèi)部創(chuàng)建一個促銷類的引用并在促銷方法調(diào)用促銷類的促銷方法,然后我們其實很自然的就能想到下一步了,也就是創(chuàng)建抽象促銷類,然后子類進行實現(xiàn),并約定好自己的促銷策略,而商品類只需聲明并調(diào)用抽象促銷類促銷方法就可以,
// 商品類class Goods{//促銷接口引用public IDiscountStrategy DiscountStrategy { get; set; }// 商品名稱public string GoodsName { get; set; }// 商品價格public decimal GoodsPrice { get; set; }// 促銷方法public void Discount(){//調(diào)用促銷類的促銷方法DiscountStrategy.Discount();//Console.WriteLine("這是促銷方法,目前無促銷");}}// 促銷類interface IDiscountStrategy{// 定義促銷方法void Discount();}//八折折扣class EightyPercentDS : IDiscountStrategy{public void Discount(){Console.WriteLine("這是促銷方法,我打八折");}}//七折折扣class SevenPercentDS : IDiscountStrategy{public void Discount(){Console.WriteLine("這是促銷方法,我打八折");}}這個小的促銷功能就完成了,并且我們可以感覺到在寫代碼時總是這樣使用
從這里可以看到策略模式的兩個好處
策略模式體現(xiàn)了兩個原則:
其中策略模式強調(diào)的是組合,也就是有一個(HAS-A),只是這里并沒有很好的體現(xiàn),在裝飾者模式更能很好的體現(xiàn)
我們在設(shè)計編寫代碼時也要遵守這樣的規(guī)則,讓系統(tǒng)變得更有彈性.
策略模式結(jié)構(gòu)
UML
下面是這個簡單的策略模式的UML圖
但在項目中有時候卻會再抽象一層,將環(huán)境角色類(當(dāng)前Goods)抽象成抽象類也就是這樣的UML圖
這樣的UML可以想象成將Goods類變成抽象類,然后再聲明它的子類,例如ComputerGoods(電視),BookGoods(書籍),然后利用繼承的特性來解放實現(xiàn),也就是我們常說的面對接口編程
注: 面對接口編程并不是面對Interface編程,而是面對超類編程
策略模式定義
定義一個算法家族,分別封裝起來,讓它們可以互相替換,此模式讓算法的變化獨立于使用算法的客戶
轉(zhuǎn)載于:https://www.cnblogs.com/yan7/p/9787946.html
總結(jié)
以上是生活随笔為你收集整理的设计模式学习---策略模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ACM数学(转)
- 下一篇: 3-2.6==0.4