真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

C#設計模式之策略模式的示例分析

這篇文章給大家分享的是有關C#設計模式之策略模式的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯建站成立以來不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術為基點,以客戶需求中心、市場為導向”的快速反應體系。對公司的主營項目,如中高端企業(yè)網站企劃 / 設計、行業(yè) / 企業(yè)門戶設計推廣、行業(yè)門戶平臺運營、成都app軟件開發(fā)、手機網站開發(fā)、微信網站制作、軟件開發(fā)、西部信息中心等實行標準化操作,讓客戶可以直觀的預知到從創(chuàng)新互聯建站可以獲得的服務效果。

策略模式(Stragety Pattern)

策略模式屬于行為型模式,它定義了一系列的算法,并將每一個算法封裝起來,而且使他們可以相互替換,讓算法獨立于使用它的客戶而獨立變化。

使用策略模式可以把行為和環(huán)境分割開來。環(huán)境類負責維持和查詢行為類,各種算法則在具體策略類中提供。

角色:

1、抽象策略(Strategy)

這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口;

2、具體策略(Concrete Strategy)

實現抽象策略的具體策略類,包裝了相關的算法或行為;

3、環(huán)境類(Context)

持有一個Strategy類的引用并可以根據邏輯選擇實例相應的策略。

示例:

C#設計模式之策略模式的示例分析

命名空間StragetyPattern中包含策略基類Tax以及它的8個實現類,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為速算扣除數,Calculate計算相應收入的個人所得稅。

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 _taxLevel = new List{
        0,
        1500,
        4500,
        9000,
        35000,
        55000,
        80000,
        decimal.MaxValue
    };

    private List _levels = new List();

    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元),之后通過反射和一些技巧選擇相應的Tax實現類來計算相應階梯的個人所得稅。

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();
    }

}

以上是調用方的代碼,Calculate經過特殊處理以支持方法鏈。以下是這個案例的輸出結果:

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、策略類的等級結構定義了一個算法或行為族,恰當使用繼承可以把公共的代碼移到父類里面,從而避免重復的代碼;
2、繼承可以處理多種算法或行為,可以避免使用多重條件轉移語句。

缺點:

1、客戶端必須知道所有的策略類,并自行決定使用哪一個策略類;
2、策略模式造成很多的策略類,造成“子類爆炸”。

使用場景:

1、如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為;
2、一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。

感謝各位的閱讀!關于“C#設計模式之策略模式的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!


網頁名稱:C#設計模式之策略模式的示例分析
當前URL:http://weahome.cn/article/igeoch.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部