전략 (Strategy) 패턴 행동 패턴
특정한 계열의 알고리즘을 캡슐화하여 동적인 교체가 가능하도록 합니다.
|
전략이란 어떤 목적을 달성하기 위해 행동하는 방식을 일컫는다. 전략이란 단어를 프로그래밍적으로 해석하면 알고리즘이라 할 수도 있는데, 알고리즘은 프로그래밍에서 작업을 수행하기 위한 필수적인 요소이다.
객체지향 프로그래밍에서의 객체는 요구하는 작업을 수행하기 위해 알고리즘을 사용하게 되는데, 알고리즘을 수행할 객체 안에 직접 알고리즘을 구현한다면 객체는 해당 알고리즘과 강한 결합이 생겨 알고리즘을 추가하거나 변경해야 할 경우 해당 객체를 직접 수정해야 하고, 객체가 사용하고 있는 알고리즘을 전환하기 어려우며, 다른 객체에서 동일한 알고리즘을 중복적으로 구현하게 되는 상황이 발생할 수도 있다. 그래서, 전략 패턴은 알고리즘을 객체지향적으로 구현할 수 있도록 도와준다.
전략 (Strategy) 패턴은 동일 계열의 알고리즘을 객체화하여 제공되는 인터페이스를 통해 알고리즘을 사용할 수 있게 해주는 패턴이다. 알고리즘을 사용하는 객체는 전략 객체를 교체함으로써 동일 계열의 다양한 알고리즘을 선택할 수 있게 된다.
전략 패턴을 구성하는 세가지 요소는 알고리즘을 구현하는 전략 객체와 이를 사용하는 대상 객체, 그리고 대상 객체에게 전략 객체를 설정하는 클라이언트가 있다. 클라이언트가 상황에 따라 적절한 전략 객체를 대상 객체에게 설정하면, 대상 객체는 설정된 전략 객체에 따라 클라이언트가 의도한 작업을 수행하게 해줄 수 있다.
전략 패턴을 사용하면 대상 객체를 수정하지 않고 전략 객체를 통해 알고리즘을 용이하게 변형하거나 확장할 수 있고, 대상 객체는 전략 객체를 통해 행동을 쉽게 전환할 수가 있다. 또한 다른 대상 객체가 동일한 계열의 알고리즘을 사용한다면, 전략 객체를 재사용함으로써 중복적인 구현을 피할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | public class PatternStrategy { public class Context { private IStrategy _strategy; public void SetStrategy(IStrategy strategy) { _strategy = strategy; } public void Operation() { Console.WriteLine(_strategy.Algorithm("Context")); } } public interface IStrategy { string Algorithm(string context); } public class StrategyA : IStrategy { public string Algorithm(string context) { return "Operate " + context + " as StrategyA"; } } public class StrategyB : IStrategy { public string Algorithm(string context) { return "Operate " + context + " as StrategyB"; } } public static void Main(string[] args) { Context context = new Context(); context.SetStrategy(new StrategyA()); context.Operation(); context.SetStrategy(new StrategyB()); context.Operation(); } } | cs |
1 2 3 | Operate Context as StrategyA Operate Context as StrategyB Press any key to continue . . . | cs |
위의 예제에서 Context 객체가 클라이언트에 의해 StrategyA 객체와 StrategyB 객체로 전략이 설정되었다. 전략 객체를 설정한 후 각각 동일하게 Operation() 메소드를 호출하였으나 다른 전략 객체의 Algorithm(string) 메소드로 인해 다른 결과를 도출하게 되었다.
'PROGRAMMING > Design Pattern' 카테고리의 다른 글
[GoF] 템플릿 메서드 (Template Method) 패턴 (0) | 2019.03.09 |
---|---|
[GoF] 반복자 (Iterator) 패턴 (0) | 2019.03.09 |
[GoF] 해석자 (Interpreter) 패턴 (0) | 2019.03.09 |
[GoF] 상태 (State) 패턴 (0) | 2019.03.09 |
[GoF] 명령 (Command) 패턴 (0) | 2019.03.09 |