- 상태 패턴 이란 ?
보통 객체를 추상화할 때 행동의 주체가 클래스, 대상이 하는 행동이 메쏘드로 정의되고,해당 대상의 상태는 속성으로 정의된다.
따라서 현재 주체의 상태에 따라 행동이 다를 경우, 상태에 조건문을 두어 행동을 다르게 하는 경우가 많습니다.
그런데 이러면 상태의 종류가 많아질수록 조건문도 많아지게 되고, 코드의 가독성이 떨어지게 된다는 단점이 있습니다.
이를 보완하고자, 상태 자체를 객체로 만들고 상태에 따른 액션도 이 객체에다가 포함시킵니다
이러면, 주체는 상태를 일일이 조건문으로 검사하지 않고, 올바른 상태 객체의 액션만 실행시키면 원래 원하던 일을 수행할 수 있다.상태 패턴은 상태 자체를 객체화함으로써,상태에 따른 액션도 상태 객체에 내부에 구현하는 패턴이다. 객체의 내부 상태가 바뀜에 따라서 객체 행동을 변경 할 수 있도록 해주는 패턴 입니다.
2.State 패턴 UML
state(상태): 상태가 변할 때마다 다른 동작을 하는 인터페이스를 결정한다.
ConcreteState(구체적인 상태): State의 인터페이스를 구체적으로 구현
Context(상황):현재의 상태를 나타내는 concreteState 역할을 가진다. 또, state 패턴의 이용자에게 필요한 인터페이스를 결정
3. 자바 예제
뽑기 기계를 구현 한다고 가정해보면 , 해당 기계가 가지는 상태는 1. 동전이 있음 2. 동전이 없음 3. 캡슐 출력중 4. 캡슐 매진 과 같은 상황이 있다고 가정하고 클래스를 작성해봅시다 .
이때 전혀 새로운 상태가 추가 된다면 ? 새로운 이프문을 또 추가하고 검증해야되는데 이럴경우 사용하는 패턴이 state 패턴입니다.
해결방법은 상태라는 인터페이스를 구현하고 각각의 상태에서 행동을 정의 하는 방식으로 설계 합니다 .
gumballmachine 클래스 위와 같이 객체들을 구성으로 가지며 , 생성자를 통해 초기화를 합니다 . 이때 본인을 매개 변수로 넘겨서 해당 state클래스에서 참조할 수 있도록 합니다.
state 인터페이스 - 공통된 행동을 정의 합니다 .
noQuarterState 클래스 - 각각의 상태에 따라 행동을 정의해줍니다.
4. 장단점 ?
장점
-코드가 간결해지고 가독성이 올라간다 .
-각 state를 변경하는것에 대해서는 닫혀 있으면서 context 자체는 새로운 상태 클래스를 추가하는 확장에 대해서는 열려있도록 바뀜 (OCP, Open-Closed Principle)
단점
-상태에 따른 조건물을 대신한 상태 객체가 증가하여 관리해야할 클래스의 수가 증가 한다.
6.활용
JDBC 트랜잭션(Transaction) -setAutoCommit(boolean autoCommit)
-대표적으로 스테이트 패턴 적용된 예시
-setAutoCommit(true || false)에 따라서 JDBC의 상태가 바뀐다.
7. 패턴 비교 하기
'디자인 패턴' 카테고리의 다른 글
디자인 패턴 - 싱글톤 패턴 (singleton pattern) (0) | 2021.04.18 |
---|