상태와 전략은 둘 다 기본 골자는 비슷하다.


상태와 전략의 기본 골자






상태와 전략 둘 다 Context에서 InterfaceParent.Execute()를 실행한다는 것이 포인트이다. 객체지향적인 설계이기 때문인데, ConcreteSon의 종류가 현재는 2개 뿐이지만 3, 4, 5.....로 늘어나더라도 Context는 InterfaceParent.Execute()를 실행할 뿐이므로, OCP(Open-Closed Principle : 확장에는 열리고, 수정에는 닫혀야 한다는 객체지향의 원리)를 지킬 수 있다. 만약 Context에서 ConcreteSon1.Execute(), ConcreteSon2.Execute()...... 이런식으로 실제 객체의 함수를 직접호출 했다면, ConcreteSon이 늘어날 때마다 Context 내부를 수정해야 하기 때문에 지저분한 코드가 될 것이다.



기본 골자가 비슷하다면 전략패턴과 상태패턴의 차이는 무엇인가?


바로 SetConcreteSon을 어디서 호출할 것인가 이다.


이 블로그의 전략패턴 글에서, SetState함수(SetConcreteSon함수에 해당)를 키보드 입력에 따라서 Player(Client에 해당)에서 호출하고 있다.

이 블로그의 상태패턴 글에서, SetState함수(SetConcreteSon함수에 해당)를 StateOpen과 StateClose(ConcreteSon1, 2에 해당)에서 호출하고 있다.


즉, 외부에서 인위적으로 ConcreteSon 객체를 바꿔준 후 Execute()함수를 호출하고 싶다면 전략패턴을 사용해야한다.

반면, Client는 단순히 Context.Operate()함수를 호출해줄 뿐이고, 그때마다 내부적으로 알아서 ConcreteSon 객체가 바뀌게 하고 싶다면 상태패턴을 사용하면 된다.


구조의 골자는 비슷하지만 목적이 다른 두 패턴이므로 적재적소에 써주면 된다.

+ Recent posts