디자인 모드 - 전략 모드 상세 설명

6089 단어
머리말
전략 모델 을 말 하기 전에 우 리 는 소매 업계 소프트웨어 의 고객 유형 에 대한 할인 기능 을 살 펴 보 았 다.
vip 고객 은 20% 할인 하고 svip 고객 은 30% 할인 합 니 다.
코드 구현:
 if (customer == "vip")
 {
       amount = amount * 0.8;
 }
 else if (customer == "svip")
 {
       amount = amount * 0.7;
 }

코드 를 보 는 것 은 매우 간단 합 니 다. 그러나 오늘 VIP 를 20% 할인 하고 내일 70% 할인 해 야 한다 면 원래 의 코드 를 바 꿔 야 합 니 다. 그러면 개폐 원칙 에 어 긋 납 니 다.여기 서 변 화 된 것 은 할인 의 계산 방식 (전략) 이 고 전략 모델 은 이런 문 제 를 해결 할 수 있다.
개념
전략 모델 은 대상 행동 형 모델 이다.전략 모드 (Strategy Pattern): 일련의 알고리즘 을 정의 하고 모든 알고리즘 을 패키지 하여 서로 바 꿀 수 있 도록 합 니 다.
실현
전략 모델 은 세 가지 역할 을 포함한다. 상황: 문맥 류, 전략: 추상 적 인 전략 류, Concrete Strategy: 구체 적 인 전략 류
추상 정책 클래스:
    public abstract class AbstractDiscountStrategy
    {
        public abstract decimal Discount(decimal amount);
    }

구체 적 인 전략 클래스:
    public class VipDiscountStrategy:AbstractDiscountStrategy
    {
        public override decimal Discount(decimal amount)
        {
            return amount * 0.8M;
        }
    }
    public class SVipDiscountStrategy:AbstractDiscountStrategy
    {
        public override decimal Discount(decimal amount)
        {
            return amount * 0.7M;
        }
    }

환경 클래스:
   public class StrategyContext
    {
        private AbstractDiscountStrategy discountStrategy;

        public StrategyContext(AbstractDiscountStrategy concreteDiscountStrategy)
        {
            this.discountStrategy = concreteDiscountStrategy;
        }

        public decimal ExecuteStrategy(decimal amount)
        {
            return this.discountStrategy.Discount(amount);
        }
    }

호출:
 if (customer == "vip")
            {
                context = new StrategyContext(new VipDiscountStrategy());
                amount = context.ExecuteStrategy(amount);
            }
            else if (customer == "svip")
            {
                context = new StrategyContext(new SVipDiscountStrategy());
                amount = context.ExecuteStrategy(amount);
            }

이 를 통 해 알 수 있 듯 이 정책 모델 을 응용 한 후에 VIP 고객 의 할인 계산 방식 을 수정 하려 면 해당 하 는 전략 만 수정 하면 됩 니 다. 클 라 이언 트 의 호출 코드 를 수정 하지 않 아 도 svip 의 할인 계산 방식 에 영향 을 주지 않 고 개폐 원칙 에 부합 합 니 다.
ssvip 클 라 이언 트 를 하나 더 추가 하려 면 대응 하 는 전략 실현 클래스 를 추가 하고 클 라 이언 트 의 호출 방법 을 수정 하면 됩 니 다.
vip 와 svip 의 전략 은 교환 할 수 있 습 니 다.
총화
위의 예 를 통 해 알 수 있 듯 이 전략 모델 의 장점 은 '개폐 원칙' 에 대한 완벽 한 지원 을 제공 하 는 것 이다. 사용 자 는 기 존의 시스템 을 수정 하지 않 은 토대 에서 알고리즘 이나 행 위 를 선택 할 수도 있 고 새로운 알고리즘 이나 행 위 를 유연 하 게 추가 할 수도 있다.
단점 도 뚜렷 하 다. 클 라 이언 트 는 모든 전략의 용 도 를 잘 알 고 어떤 전략 을 사용 할 지 스스로 결정 하여 클 라 이언 트 의 부담 을 증가 시 켜 야 한다. 이 문 제 는 설정 방식 으로 해결 할 수 있다.모든 전략 은 하나의 유형 이 필요 하고 전략 류 를 증가 시 킬 것 이다.
코드 다운로드:https://github.com/hzhhhbb/StrategyPattern

좋은 웹페이지 즐겨찾기