상태 패턴(State Pattern)

문딤·2022년 7월 27일
0

상태 패턴의 예시

  • State: 시스템의 모든 상태에 공통의 인터페이스를 제공한다. 따라서 이 인터페이스를 실체화한 어떤 상태 클래스도 기존 상태 클래스를 대신해 교체해서 사용할 수 있다.
  • State1, State2, State3: Context 객체가 요청한 작업을 자신의 방식으로 실제 실행한다. 대부분의 경우 다음 상태를 결정해 상태 변경을 Context 객체에 요청하는 역할도 수행한다.
  • Context: State를 이용하는 역할을 수행한다. 현재 시스템의 상태를 나타내는 상태 변수 (state)와 실제 시스템의 상태를 구성하는 여러 가지 변수가 있다. 또한 각 상태 클래스에서 상태 변경을 요청해 상태를 바꿀 수 있도록 하는 메서드(setState)가 제공된다. Context 요소를 구현한 클래스의 request 메서드는 실제 행위를 실행하는 대신 해당 상태 객체에 행위 실행을 위임한다.

인터페이스

interface PowerState {
   public void powerPush();
}

구현된 각 상태클래스

 class On implements PowerState{
    public void powerPush(){
        System.out.println("전원 off");
    }
}
 class Off implements PowerState {
    public void powerPush(){
        System.out.println("절전 모드");
    }
}
 class Saving implements PowerState {
    public void powerPush(){
        System.out.println("전원 on");
    }
}

상태 값 분기가 사라진 laptop 클래스


class Laptop {
    private PowerState powerState;

    public Laptop(){
        this.powerState = new Off();
    }

    public void setPowerState(PowerState powerState){
        this.powerState = powerState;
    }

    public void powerPush(){
        powerState.powerPush();
    }
}

Main 클래스


  public static void main(String args[]){
        Laptop laptop = new Laptop();
        On on = new On();
        Off off = new Off();
        Saving saving = new Saving();

        laptop.powerPush();
        laptop.setPowerState(on);
        laptop.powerPush();
        laptop.setPowerState(saving);
        laptop.powerPush();
        laptop.setPowerState(off);
        laptop.powerPush();
        laptop.setPowerState(on);
        laptop.powerPush();
    }

console

절전 모드
전원 off
전원 on
절전 모드
전원 off

powerpush에 따라 전원이 꺼지기도 켜지기도 함.
해당 내용을 추상적으로 인터페이스에 묶어서 재정의 할 수 있다는 것이 유용하게 사용 될 것 같다.

상태 패턴의 장단점

⭕ 장점

  1. 하나의 객체에 대한 여러 동작을 구현해야할 때 상태 객체만 수정하므로 동작의 추가, 삭제 및 수정이 간단해진다.
  2. State 패턴을 사용하면 객체의 상태에 따른 조건문(if/else, switch)이 줄어들어 코드가 간결해지고 가독성이 올라간다.

❌ 단점

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

상태패턴 vs 전략패턴(공통점과 차이점)

공통점

인터페이스를 사용함으로서 Concrete Class를 캡슐화 한다.

따라서 ContextClass에서 어떤 클래스가 할당되었는지에 관계없이 인터페이스만을
인자로 받아서 그래도 수행.
context class의 영향없이 유연한 변경, 대처 가능.

차이점

Strategy 패턴의 경우 어떤 class를 할당할지 user, client가 결정해야함.
💨판단의 주체의 선택에 따른 대처

State 패턴은 상태변화에 따른 로직의 제어에 사용. client(x)

profile
풀스택개발자가 될래요

0개의 댓글