Strategy Pattern
Strategy 패턴은 일련의 알고리즘을 정의하고 각 알고리즘을 결합하는 행동 패턴입니다. 이를 캡슐화하여 상호 교환 가능하게 만들고, 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있습니다.
전략 패턴을 사용하면 행동과 환경을 분리할 수 있습니다. 환경 클래스는 행위 클래스를 유지하고 조회하는 역할을 담당하며, 특정 전략 클래스에는 다양한 알고리즘이 제공된다.
역할:
1. 추상적인 전략(Strategy)
이는 추상적인 역할이며 일반적으로 다음으로 구성됩니다. 인터페이스 또는 추상 클래스 구현. 이 역할은 구체적인 전략 클래스에 필요한 모든 인터페이스를 제공합니다.
2. 구체적인 전략
알고리즘 또는 동작과 관련된 추상 전략 및 패키지를 구현하는 구체적인 전략 클래스입니다. #
3. 환경 클래스(Context) 은 Strategy 클래스에 대한 참조를 보유하고 로직을 기반으로 인스턴스에 해당하는 전략을 선택할 수 있습니다.예:
네임스페이스 StrategytyPattern에는 전략 기본 클래스 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; } }
public class Level0 : Tax { public Level0() { TaxRate = 0.00m; QuickDeduction = 0; } }
public class Level1 : Tax { public Level1() { TaxRate = 0.03m; QuickDeduction = 0; } }
public class Level2 : Tax { public Level2() { TaxRate = 0.10m; QuickDeduction = 105; } }
public class Level3 : Tax { public Level3() { TaxRate = 0.20m; QuickDeduction = 555; } }
public class Level4 : Tax { public Level4() { TaxRate = 0.25m; QuickDeduction = 1005; } }
public class Level5 : Tax { public Level5() { TaxRate = 0.30m; QuickDeduction = 2755; } }
public class Level6 : Tax { public Level6() { TaxRate = 0.35m; QuickDeduction = 5505; } }
public class Level7 : Tax { public Level7() { TaxRate = 0.45m; QuickDeduction = 13505; } }
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; } }
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(); } }
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!
Advantages:
1. 전략 클래스의 계층 구조는 알고리즘 또는 동작을 정의합니다. family, 상속을 올바르게 사용하면 공통 코드를 상위 클래스로 이동할 수 있으므로 중복 코드를 피할 수 있습니다2 상속을 통해 다양한 알고리즘이나 동작을 처리할 수 있으며 여러 조건부 전송 문을 사용하지 않아도 됩니다.
단점:
1 클라이언트는 모든 정책 클래스를 알고 어떤 클래스를 사용할지 결정해야 합니다. 2. 전략 모델은 많은 전략 클래스를 생성하여 "하위 클래스 폭발"을 초래합니다.
사용 시나리오:
1. 시스템에 많은 클래스가 있고 클래스 간의 차이점은 동작에만 있는 경우 전략 패턴을 사용하면 객체가 여러 동작 중에서 하나의 동작을 동적으로 선택하도록 할 수 있습니다.2 시스템은 여러 알고리즘 중 하나를 동적으로 선택해야 합니다.
디자인 패턴이란 무엇입니까 - PHP 고급 디자인 패턴 비디오 튜토리얼
위 내용은 C# 디자인 패턴의 전략 패턴에 대한 심층적인 이해 및 역할별 사례 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!