[Design Pattern] 행동 패턴 3. 전략 (Strategy)
Table of Contents
전략 (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
}
}