본문 바로가기

IT/디자인 패턴(Design Pattern)

[디자인 패턴] 상태 패턴(State Pattern)

1) 개요

상태 디자인 패턴은 객체 내부의 상태에 따라 동작을 변경해야할 때 사용하는 디자인 패턴입니다.


- 장점

1. 하나의 객체에 대한 여러 동작을 구현해야할 때 상태 객체만 수정하므로 동작의 추가, 삭제 및 수정이 간단해집니다.

2. State 패턴을 사용하면 객체의 상태에 따른 조건문(if/else, switch)이 줄어들어 코드가 간결해지고 가독성이 올라갑니다.


- 단점

1. 상태에 따른 조건문을 대신한 상태 객체가 증가하여 관리해야할 클래스의 수가 증가합니다.



2) UML

- Context : 객체의 상태를 정의하는 데 사용되는 메소드를 정의하는 인터페이스입니다.

- State : 상태에 따른 동작을 정의하는 인터페이스입니다.

- ConcreteState : State에서 정의된 메소드를 구현하는 클래스입니다.


3) 예제

1
2
3
4
public interface MobileAlertState {
    public void alert(AlertStateContext ctx);
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class AlertStateContext {
    private MobileAlertState currentState;
    
    public AlertStateContext() {
        currentState = new Vibration();
    }
    
    public void setState(MobileAlertState state) {
        currentState = state;
    }
    
    public void alert() {
        currentState.alert(this);
    }
}
 
cs

1
2
3
4
5
6
7
8
9
public class Vibration implements MobileAlertState{
 
    @Override
    public void alert(AlertStateContext ctx) {
        System.out.println("Vibration");
    }
 
}
 
cs

1
2
3
4
5
6
7
8
9
public class Slient implements MobileAlertState{
 
    @Override
    public void alert(AlertStateContext ctx) {
        System.out.println("Silent");
    }
 
}
 
cs

1
2
3
4
5
6
7
8
9
public class Main {
    public static void main(String[] args) {
        AlertStateContext stateContext = new AlertStateContext();
        stateContext.alert();
        stateContext.setState(new Slient());
        stateContext.alert();
    }
}
 
cs


- Reference : 

https://www.geeksforgeeks.org/state-design-pattern/