Skip to main content

[Design Pattern] 행동 패턴 3. 전략 (Strategy)




전략 (Strategy) #

전략

  • 바꿔 쓸 수 있는 행동을 캡슐화하고, 어떤 행동을 사용할지는 서브클래스에 맡긴다.
  • 특징
    • 클라이언트가 런타임에 손쉽게 행동(알고리즘)을 바꿔가면서 쓸 수 있게 해준다.
    • 클라이언트는 각각의 Strategy가 어떤 전략인지를 알고 있어야 한다.



개념적인 예시 #

// 클라이언트가 원하는 것을 담고 있는 Context
class Context
{
    // Strategy를 가지고 있다. 
    // 구체적으로 어떤 행동을 할지는 모른다. 
    private IStrategy _strategy;

    public Context() { }

    public Context(IStrategy strategy)
    {
        this._strategy = strategy;
    }

    // 런타임에 Strategy를 바꿀 수 있게 한다. 
    public void SetStrategy(IStrategy strategy)
    {
        this._strategy = strategy;
    }

    // Strategy가 행동을 하도록 한다. 
    public void DoSomeBusinessLogic()
    {
        var strs = new List<string>{ "a", "b", "c", "d", "e" };
        var result = this._strategy.DoAlgorithm(strs);

        string resultStr = string.Empty;
        foreach (var element in result as List<string>)
        {
            resultStr += element + ",";
        }

        Console.WriteLine(resultStr);
    }
}

// 특정 행동을 하는 Strategy 
public interface IStrategy
{
    object DoAlgorithm(object data);
}

class ConcreteStrategyA : IStrategy
{
    public object DoAlgorithm(object data)
    {
        var list = data as List<string>;
        list.Sort();
        
        return list;
    }
}

class ConcreteStrategyB : IStrategy
{
    public object DoAlgorithm(object data)
    {
        var list = data as List<string>;
        list.Sort();
        list.Reverse();
        
        return list;
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 클라이언트는 자기가 원하는 행동을 알고, 그에 맞는 Strategy를 Context에 넘겨준다. 
        var context = new Context();

        context.SetStrategy(new ConcreteStrategyA());
        context.DoSomeBusinessLogic(); // a,b,c,d,e
        
        context.SetStrategy(new ConcreteStrategyB());
        context.DoSomeBusinessLogic(); // e,d,c,b,a
    }
}



References #