[디자인 패턴 - C#] 전략 패턴 (Strategy Pattern)

빵욱·2024년 3월 19일

C#_디자인 패턴

목록 보기
1/4

전략 패턴?

알고리즘군을 정의하고 캡슐화해서 각 알고리즘군을 수정해서 쓰는 법이라고 한다.

뭔 소린지는 정확히 이해가 안가는데, 객체의 행동을 실행 시간에 변경할 수 있도록 하는 디자인 패턴 이라고 생각하면 된다고 한다.

=> 어떤 동작을 상황에 맞게 잘 변경해서 사용한다는 뜻 같다.

패턴 적용 방법

간단한 결제를 한다는 가정으로 예제를 만들어 보았다.
(Console 프로그램으로 만듬)

알고리즘군에서 사용할 공용 인터페이스를 정의

 public interface IPaymentStrategy
 {
     void Pay(int _amount);
 }

IPaymentStrategy 라는 인터페이스를 정의한다.
구체적인 동작 클래스를 구현할 때 이 인터페이스를 상속받아 구현하고 알고리즘을 캡슐화 한다.

알고리즘 클래스 정의

ConcreteStrategy (구체적인 전략) 클래스라고 부를수 도 있는 알고리즘(동작) 클래스를 정의한다.

간단한 예제로 2개만 만들어 보았다.

 public class CreditCardStrategy : IPaymentStrategy
 {
     private string? name;
     private string? cardNumber;
     public CreditCardStrategy(string _name, string _cardNumber)
     {
         this.name = _name;  
         this.cardNumber = _cardNumber;  
     }
     public void Pay(int _amount)
     {
         Console.WriteLine($"-- ${_amount}가 {this.cardNumber}를 사용하여 신용 카드로 지불되었습니다..");
     }
 }
public class KakaoPayStrategy : IPaymentStrategy
{
    private string name;
    private string payNumber;

    public KakaoPayStrategy(string _name, string _payNumber)
    {
        this.name = _name;
        this.payNumber = _payNumber;
    }
    public void Pay(int _amount)
    {
        Console.WriteLine($"-- ${_amount}가 {this.payNumber}를 사용하여 카카오페이로 지불되었습니다..");
    }
}

신용카드, 카카오페이라는 결제(동작, 방법)클래스를 만들었다.

문맥 클래스

전략(방법)을 사용할 클래스를 정의한다.
보통 이 클랫그에서 전략을 선택하는 Set 메서드를 통해서 전략을 참조하여 사용한다.
이것을 위해 위에서 인터페이스 클래스를 정의했다.

  • 장바구니 클래스정의
 public class Shoppingbasket
 {
     private IPaymentStrategy? paymentStrategy;

     public void SetPaymentStrategy(IPaymentStrategy _paymentStrategy)
     {
         this.paymentStrategy = _paymentStrategy;
     }

     public void Checkout(int _amount)
     {
         paymentStrategy?.Pay(_amount);
     }
 }

SetPaymentStrategy메서드를 통해서 결제방법을 변경할 수 있다.

Program.cs

 internal class Program
 {
     static void Main(string[] args)
     {
         Shoppingbasket shoppingbasket = new Shoppingbasket();

         shoppingbasket.SetPaymentStrategy(new CreditCardStrategy("DODO", "1234-456789"));
         shoppingbasket.Checkout(50000);

         shoppingbasket.SetPaymentStrategy(new KakaoPayStrategy("DODO-PAY", "789-456-123"));
         shoppingbasket.Checkout(50000);
     }
 }

실행하면 아래와 같은 결과를 볼 수있다.

-- $50000가 1234-456789를 사용하여 신용 카드로 지불되었습니다..
-- $50000가 789-456-123를 사용하여 카카오페이로 지불되었습니다..

중간에 SetPaymentStrategy 메서드를 통해서 결제방법을 변경했다.

어플레이케이션을 개발할 때 여러 알고리즘(행동) 중 선택해서 사용하거나 할 때 잘 활용하면 될 것 같다.

profile
rove drink eat

0개의 댓글