스테이트 패턴 (State Pattern)
객체 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있다.
마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다.
》》 상태 객체를 따로 생성하고, 상태 객체에게 위임하여 동작
※ 스테이트 패턴의 예제
천원짜리 지폐를 넣으면 100원짜리 동전 10개로 교환해주는 동전교환기가 있다.
이 동전교환기를 어떻게 구현하는 것이 좋을까? 우선 동전교환기의 상태들을 모은다.
이것을 상태에 따라 if문으로 구현한다면?
- 디자인원칙 OCP를 지키지 못한다.
- 객체지향 디자인이라고 보기엔 무리가 있다.
- 지저분한 조건문으로 인한 가독성이 저하된다.
- 무엇보다 추후에 발생하는 유지보수와 코드 확장의 어려움을 겪는다.
그렇다면 어떻게 구현하는 것이 좋을까?
- 먼저 동전교환기에 관련된 모든 행동의 메소드가 들어있는 State인터페이스를 정의해야한다.
- 그 다음으로 교환기의 모든 상태에 대해서 클래스를 구현해야한다.
- 마지막으로 조건문 코드를 모두 없애고 상태 클래스에 모든 작업을 위임한다.
스테이트 패턴 vs 스트래티지 패턴
스테이트패턴은 스트래티지(전략) 패턴과 별반 다를게 없어보인다.
이 두가지 패턴은 용도에 있어서 차이를 보인다 !
※ State Pattern
상황에 따라 컨텍스트 객체에서 여러 상태 객체 중 한 객체에게 모든 행동을 맡긴다
클라이언트는 상태 객체에 대해서 거의 몰라도 된다.
수많은 조건문을 집어넣는 대신에 사용할 수 있는 패턴
※ Strategy Pattern
클라이언트에서 컨텍스트 객체에게 어떤 전략 객체를 사용할 지를 지정해준다.
실행 시에 전략 객체를 변경할 수 있는 유연성을 제공한다.
'Knowledge > Design Pattern' 카테고리의 다른 글
이터레이터 패턴 (Iterator Pattern) (0) | 2017.01.26 |
---|---|
퍼사드 패턴 (Facade Pattern) (0) | 2017.01.24 |
어댑터 패턴 (Adapter Pattern) (2) | 2017.01.23 |
커맨드 패턴 (Command Pattern) (0) | 2017.01.20 |
싱글톤 패턴 (Singleton Pattern) (0) | 2017.01.19 |