這篇文章給大家分享的是有關(guān)C#設(shè)計模式之策略模式的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)一直通過網(wǎng)站建設(shè)和網(wǎng)站營銷幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實效"的一站式服務(wù),以網(wǎng)站設(shè)計、網(wǎng)站制作、移動互聯(lián)產(chǎn)品、成都營銷網(wǎng)站建設(shè)服務(wù)為核心業(yè)務(wù)。十余年網(wǎng)站制作的經(jīng)驗,使用新網(wǎng)站建設(shè)技術(shù),全新開發(fā)出的標(biāo)準(zhǔn)網(wǎng)站,不但價格便宜而且實用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡單易用,維護方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。策略模式(Stragety Pattern)
策略模式屬于行為型模式,它定義了一系列的算法,并將每一個算法封裝起來,而且使他們可以相互替換,讓算法獨立于使用它的客戶而獨立變化。
使用策略模式可以把行為和環(huán)境分割開來。環(huán)境類負(fù)責(zé)維持和查詢行為類,各種算法則在具體策略類中提供。
角色:
1、抽象策略(Strategy)
這是一個抽象角色,通常由一個接口或抽象類實現(xiàn)。此角色給出所有的具體策略類所需的接口;
2、具體策略(Concrete Strategy)
實現(xiàn)抽象策略的具體策略類,包裝了相關(guān)的算法或行為;
3、環(huán)境類(Context)
持有一個Strategy類的引用并可以根據(jù)邏輯選擇實例相應(yīng)的策略。
示例:
命名空間StragetyPattern中包含策略基類Tax以及它的8個實現(xiàn)類,Context環(huán)境類持有策略基類。本示例通過一個優(yōu)雅的方式來計算個人所得稅。
C#開發(fā)筆記之04-如何用C#優(yōu)雅的計算個人所得稅?
namespace StragetyPattern
public abstract class Tax { protected decimal TaxRate = 0; protected decimal QuickDeduction = 0; public virtual decimal Calculate(decimal income) { return income * TaxRate - QuickDeduction; } }
策略基類Tax,表示個人所得稅,TaxRate為稅率,QuickDeduction為速算扣除數(shù),Calculate計算相應(yīng)收入的個人所得稅。
public class Level0 : Tax { public Level0() { TaxRate = 0.00m; QuickDeduction = 0; } }
0級個人所得稅階梯,表示個人所得稅的初始狀態(tài)。
public class Level1 : Tax { public Level1() { TaxRate = 0.03m; QuickDeduction = 0; } }
1級個人所得稅階梯。
public class Level2 : Tax { public Level2() { TaxRate = 0.10m; QuickDeduction = 105; } }
2級個人所得稅階梯。
public class Level3 : Tax { public Level3() { TaxRate = 0.20m; QuickDeduction = 555; } }
3級個人所得稅階梯。
public class Level4 : Tax { public Level4() { TaxRate = 0.25m; QuickDeduction = 1005; } }
4級個人所得稅階梯。
public class Level5 : Tax { public Level5() { TaxRate = 0.30m; QuickDeduction = 2755; } }
5級個人所得稅階梯。
public class Level6 : Tax { public Level6() { TaxRate = 0.35m; QuickDeduction = 5505; } }
6級個人所得稅階梯。
public class Level7 : Tax { public Level7() { TaxRate = 0.45m; QuickDeduction = 13505; } }
7級個人所得稅階梯。
public class Context { private Tax _tax = null; private const decimal EXEMPTION_VALUE = 3500m; private List<decimal> _taxLevel = new List<decimal>{ 0, 1500, 4500, 9000, 35000, 55000, 80000, decimal.MaxValue }; private List<Type> _levels = new List<Type>(); private void GetLevels() { _levels = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(tp => tp.GetTypes() .Where(t => t.BaseType == typeof(Tax))) .ToList(); } public Context() { GetLevels(); } public Context Calculate(decimal income) { _tax = new Level0(); var result = income - EXEMPTION_VALUE; for(int i = 1; i <= _taxLevel.Count - 1; i++) { if(result > _taxLevel[i - 1] && result <= _taxLevel[i]) { _tax = (Tax)Activator.CreateInstance(_levels[i]); } } Console.WriteLine($"Income = {income}," + $"tax = {_tax.Calculate(result)}!"); return this; } }
環(huán)境類Context,首先需要維持對Tax的引用,EXEMPTION_VALUE表示免征額(本例使用3500元),之后通過反射和一些技巧選擇相應(yīng)的Tax實現(xiàn)類來計算相應(yīng)階梯的個人所得稅。
public class Program { private static Context _context = new Context(); public static void Main(string[] args) { _context.Calculate(2500.00m) .Calculate(4900.00m) .Calculate(5500.00m) .Calculate(7000.00m) .Calculate(10000.00m) .Calculate(16000.00m) .Calculate(43000.00m) .Calculate(70000.00m) .Calculate(100000.00m) .Calculate(4500.00m) .Calculate(1986.00m); Console.ReadKey(); } }
以上是調(diào)用方的代碼,Calculate經(jīng)過特殊處理以支持方法鏈。以下是這個案例的輸出結(jié)果:
Income = 2500.00,tax = 0.0000! Income = 4900.00,tax = 42.0000! Income = 5500.00,tax = 95.0000! Income = 7000.00,tax = 245.0000! Income = 10000.00,tax = 745.0000! Income = 16000.00,tax = 2120.0000! Income = 43000.00,tax = 9095.0000! Income = 70000.00,tax = 17770.0000! Income = 100000.00,tax = 29920.0000! Income = 4500.00,tax = 30.0000! Income = 1986.00,tax = 0.0000!
優(yōu)點:
1、策略類的等級結(jié)構(gòu)定義了一個算法或行為族,恰當(dāng)使用繼承可以把公共的代碼移到父類里面,從而避免重復(fù)的代碼;
2、繼承可以處理多種算法或行為,可以避免使用多重條件轉(zhuǎn)移語句。
缺點:
1、客戶端必須知道所有的策略類,并自行決定使用哪一個策略類;
2、策略模式造成很多的策略類,造成“子類爆炸”。
使用場景:
1、如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為;
2、一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。
感謝各位的閱讀!關(guān)于“C#設(shè)計模式之策略模式的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
本文名稱:C#設(shè)計模式之策略模式的示例分析-創(chuàng)新互聯(lián)
文章起源:http://aaarwkj.com/article16/gcsdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、定制開發(fā)、網(wǎng)站策劃、網(wǎng)站維護、全網(wǎng)營銷推廣、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容