> 백엔드 개발 > C#.Net 튜토리얼 > C# 디자인 패턴의 전략 패턴에 대한 심층적인 이해 및 역할별 사례 공유

C# 디자인 패턴의 전략 패턴에 대한 심층적인 이해 및 역할별 사례 공유

php是最好的语言
풀어 주다: 2018-07-28 11:57:55
원래의
2958명이 탐색했습니다.

Strategy Pattern

Strategy 패턴은 일련의 알고리즘을 정의하고 각 알고리즘을 결합하는 행동 패턴입니다. 이를 캡슐화하여 상호 교환 가능하게 만들고, 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있습니다.

전략 패턴을 사용하면 행동과 환경을 분리할 수 있습니다. 환경 클래스는 행위 클래스를 유지하고 조회하는 역할을 담당하며, 특정 전략 클래스에는 다양한 알고리즘이 제공된다.

역할:

1. 추상적인 전략(Strategy)

이는 추상적인 역할이며 일반적으로 다음으로 구성됩니다. 인터페이스 또는 추상 클래스 구현. 이 역할은 구체적인 전략 클래스에 필요한 모든 인터페이스를 제공합니다.

2. 구체적인 전략

알고리즘 또는 동작과 관련된 추상 전략 및 패키지를 구현하는 구체적인 전략 클래스입니다. #

3. 환경 클래스(Context)

은 Strategy 클래스에 대한 참조를 보유하고 로직을 기반으로 인스턴스에 해당하는 전략을 선택할 수 있습니다.

예:

C# 디자인 패턴의 전략 패턴에 대한 심층적인 이해 및 역할별 사례 공유

네임스페이스 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;
    }

}
로그인 후 복사

전략 기본 클래스 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;
    }

}
로그인 후 복사

Environment 클래스 컨텍스트, 먼저 세금에 대한 참조를 유지해야 합니다. 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!
로그인 후 복사

Advantages:

1. 전략 클래스의 계층 구조는 알고리즘 또는 동작을 정의합니다. family, 상속을 올바르게 사용하면 공통 코드를 상위 클래스로 이동할 수 있으므로 중복 코드를 피할 수 있습니다

2 상속을 통해 다양한 알고리즘이나 동작을 처리할 수 있으며 여러 조건부 전송 문을 사용하지 않아도 됩니다.

단점:

1 클라이언트는 모든 정책 클래스를 알고 어떤 클래스를 사용할지 결정해야 합니다.

2. 전략 모델은 많은 전략 클래스를 생성하여 "하위 클래스 폭발"을 초래합니다.

사용 시나리오:

1. 시스템에 많은 클래스가 있고 클래스 간의 차이점은 동작에만 있는 경우 전략 패턴을 사용하면 객체가 여러 동작 중에서 하나의 동작을 동적으로 선택하도록 할 수 있습니다.

2 시스템은 여러 알고리즘 중 하나를 동적으로 선택해야 합니다.

관련 기사:

C/C++를 사용하여 PHP 확장 작성

【c# 튜토리얼】 C# 데이터 유형

관련 동영상:

디자인 패턴이란 무엇입니까 - PHP 고급 디자인 패턴 비디오 튜토리얼

위 내용은 C# 디자인 패턴의 전략 패턴에 대한 심층적인 이해 및 역할별 사례 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿