戦略パターン
戦略パターンは行動パターンであり、一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、それらを交換できるようにして、アルゴリズムが次のことを実行できるようにします。それを使用するクライアントとは独立して変更されます。
戦略パターンを使用すると、行動と環境を分離できます。環境クラスは動作クラスの維持とクエリを担当し、さまざまなアルゴリズムが特定の戦略クラスで提供されます。
ロール:
1. 抽象戦略 (戦略)
これは抽象ロールであり、通常はインターフェイスまたは抽象クラスによって実装されます。このロールは、具象戦略クラスに必要なすべてのインターフェイスを提供します;
2.具象戦略
抽象戦略を実装し、関連するアルゴリズムまたは動作をパッケージ化する具象戦略クラス;
3. 環境クラス (コンテキスト)
は、Strategy クラスへの参照を保持し、ロジックに基づいてインスタンスに対応する戦略を選択できます。
例:
名前空間 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 つを動的に選択する必要があります。
関連記事:
関連ビデオ:デザイン パターンとは - php の高度なデザイン パターン ビデオ チュートリアル
以上がC# 設計パターンの戦略パターンと役割固有のケース共有についての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。