알고리즘군을 정의하고 캡슐화해서 각 알고리즘군을 수정해서 쓰는 법이라고 한다.
뭔 소린지는 정확히 이해가 안가는데, 객체의 행동을 실행 시간에 변경할 수 있도록 하는 디자인 패턴 이라고 생각하면 된다고 한다.
=> 어떤 동작을 상황에 맞게 잘 변경해서 사용한다는 뜻 같다.
간단한 결제를 한다는 가정으로 예제를 만들어 보았다.
(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메서드를 통해서 결제방법을 변경할 수 있다.
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 메서드를 통해서 결제방법을 변경했다.
어플레이케이션을 개발할 때 여러 알고리즘(행동) 중 선택해서 사용하거나 할 때 잘 활용하면 될 것 같다.