ホームページ バックエンド開発 C#.Net チュートリアル C# 設計パターンの戦略パターンと役割固有のケース共有についての深い理解

C# 設計パターンの戦略パターンと役割固有のケース共有についての深い理解

Jul 28, 2018 am 11:57 AM
c# デザインパターン

戦略パターン

戦略パターンは行動パターンであり、一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、それらを交換できるようにして、アルゴリズムが次のことを実行できるようにします。それを使用するクライアントとは独立して変更されます。

戦略パターンを使用すると、行動と環境を分離できます。環境クラスは動作クラスの維持とクエリを担当し、さまざまなアルゴリズムが特定の戦略クラスで提供されます。

ロール:

1. 抽象戦略 (戦略)

これは抽象ロールであり、通常はインターフェイスまたは抽象クラスによって実装されます。このロールは、具象戦略クラスに必要なすべてのインターフェイスを提供します;

2.具象戦略

抽象戦略を実装し、関連するアルゴリズムまたは動作をパッケージ化する具象戦略クラス;

3. 環境クラス (コンテキスト)

は、Strategy クラスへの参照を保持し、ロジックに基づいてインスタンスに対応する戦略を選択できます。

例:

C# 設計パターンの戦略パターンと役割固有のケース共有についての深い理解

名前空間 StrategyPattern には、戦略基本クラス Tax とその 8 つの実装クラスが含まれており、Context 環境クラスは次の内容を保持します。戦略基本クラスがあります。この例は、個人所得税を計算する洗練された方法を提供します。

C# 開発ノート 04 - C# を使用して個人所得税をエレガントに計算するにはどうすればよいですか?

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 の個人所得税ラダーは、個人所得税の初期ステータスを表します。

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

}
ログイン後にコピー

環境クラス コンテキスト。最初に税への参照を維持する必要があります。EXEMPTION_VALUE は免除額 (この例では 3500 元が使用されています) を表します。次に、リフレクションといくつかの計算手法を通じて、対応する税実装クラスを選択します。対応するはしご所得税の個人。

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!
ログイン後にコピー

利点:

1. 戦略クラスの階層構造は、アルゴリズムまたは動作ファミリーを定義します。継承により、パブリックを変換できます コードの重複を避けるために、コードを親クラスに移動します;
2. 継承により、さまざまなアルゴリズムや動作を処理し、複数の条件付き転送ステートメントの使用を回避できます。

欠点:

1. クライアントはすべてのポリシー クラスを知っていて、どれを使用するかを決定する必要があります;
2. 戦略モードでは多くの問題が発生します。 「サブクラス爆発」を引き起こす戦略クラス。

使用シナリオ:

1. システム内に多数のクラスがあり、クラス間の違いがその動作のみである場合、戦略パターンを使用して動的にオブジェクトに多くの動作の中から 1 つの動作を選択させます;
2. システムは、いくつかのアルゴリズムの 1 つを動的に選択する必要があります。

関連記事:

C/C を使用した PHP 拡張機能の作成

##[c# チュートリアル]C# データ型

関連ビデオ:

デザイン パターンとは - php の高度なデザイン パターン ビデオ チュートリアル

以上がC# 設計パターンの戦略パターンと役割固有のケース共有についての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C# を使用した Active Directory C# を使用した Active Directory Sep 03, 2024 pm 03:33 PM

C# を使用した Active Directory のガイド。ここでは、Active Directory の概要と、C# での動作方法について、構文と例とともに説明します。

C# のアクセス修飾子 C# のアクセス修飾子 Sep 03, 2024 pm 03:24 PM

C# のアクセス修飾子のガイド。 C# のアクセス修飾子の種類について、例と出力とともに説明しました。

C# の乱数ジェネレーター C# の乱数ジェネレーター Sep 03, 2024 pm 03:34 PM

C# の乱数ジェネレーターのガイド。ここでは、乱数ジェネレーターの仕組み、擬似乱数の概念、安全な数値について説明します。

C# データ グリッド ビュー C# データ グリッド ビュー Sep 03, 2024 pm 03:32 PM

C# データ グリッド ビューのガイド。ここでは、SQL データベースまたは Excel ファイルからデータ グリッド ビューをロードおよびエクスポートする方法の例について説明します。

C# 文字列リーダー C# 文字列リーダー Sep 03, 2024 pm 03:23 PM

C# StringReader のガイド。ここでは、C# StringReader の概要とその動作について、さまざまな例やコードとともに説明します。

C# のパターン C# のパターン Sep 03, 2024 pm 03:33 PM

C# のパターンのガイド。ここでは、C# のパターンの概要と上位 3 種類について、その例とコード実装とともに説明します。

C# シリアル化 C# シリアル化 Sep 03, 2024 pm 03:30 PM

C# シリアル化のガイド。ここでは、C# シリアル化オブジェクトの導入、手順、作業、例についてそれぞれ説明します。

C# 文字列ライター C# 文字列ライター Sep 03, 2024 pm 03:23 PM

C# StringWriter のガイド。ここでは、C# StringWriter クラスの概要とその動作について、さまざまな例やコードとともに説明します。

See all articles