스테이트(State) 패턴: 행위패턴
객체가 상태에 따라 행위를 다르게 할 때, 직접 상태를 체크하여 상태에 따른 행위를 호출하는 것이 아니라 상태를 객체화하여 필요에 따라 다르게 행동하도록 위임하는 디자인 패턴
객체의 상태에 따라 조건문을 사용할 때, 스테이트 패턴을 적용해 볼 수 있다. 가령 사람이 가만히 서 있는 상태와 앉아 있는 상태, 걷는 상태가 있다고 했을 때, 사람 객체에 state 필드를 만들어 상태를 확인하는 것이 아닌, 이 상태들을 모두 객체화하는 것이다.
외부로부터 캡슐화하기 위해 state 인터페이스를 만들고 각 상태를 구현한다.
PersonState(state 인터페이스)
package behavioral.state;
public interface PersonState {
public void walk();
public void sit();
public void stop();
}
WalkState(state 구현체)
package behavioral.state;
public class WalkState implements PersonState {
private static WalkState walkState;
@Override
public void walk() {
System.out.println("이미 걷는 중입니다.");
}
@Override
public void sit() {
System.out.println("앉습니다.");
}
@Override
public void stop() {
System.out.println("가만히 서 있습니다.");
}
}
StopState(state 구현체)
package behavioral.state;
public class StopState implements PersonState {
private static StopState stopState;
@Override
public void walk() {
System.out.println("걷습니다.");
}
@Override
public void sit() {
System.out.println("앉습니다.");
}
@Override
public void stop() {
System.out.println("이미 가만히 서 있습니다.");
}
}
SitState(state 구현체)
package behavioral.state;
public class SitState implements PersonState {
private static SitState sitState;
@Override
public void walk() {
System.out.println("걷습니다.");
}
@Override
public void sit() {
System.out.println("이미 앉은 상태입니다.");
}
@Override
public void stop() {
System.out.println("가만히 서 있습니다.");
}
}
ContextPerson(사용자)
package behavioral.state;
public class ContextPerson {
private PersonState personState;
public ContextPerson() {
this.personState = new StopState();
}
public void setElevatorState(PersonState state) {
this.personState = state;
}
public void walk() {
personState.walk();
this.setElevatorState(new WalkState());
}
public void sit() {
personState.sit();
this.setElevatorState(new SitState());
}
public void stop() {
personState.stop();
this.setElevatorState(new StopState());
}
}
'OOP > Design Pattern' 카테고리의 다른 글
20. 전략(Strategy) 패턴 (0) | 2023.03.17 |
---|---|
18. 옵저버(Observer) 패턴 (0) | 2023.02.25 |
17. 메멘토(Memento) 패턴 (0) | 2023.02.25 |
16. 중재자(Mediator) 패턴 (0) | 2023.02.21 |
15. 이터레이터(iterator) 패턴 (0) | 2023.02.21 |