본문 바로가기
OOP

[OOP] 상태 패턴 State Pattern

by ifhead 2022. 8. 19.
반응형

상태 패턴이란?

  • 객체가 어떤 상태에 따라 다른 행위를 해야 할 때 사용합니다.
  • 상태를 객체화해서, 상태객체가 행동을 대신하도록 위임하는 패턴을 말합니다.
  • 자신이 직접 상태를 체크하여 상태에 따라 행위를 호출하지 않습니다.
  • 스테이트 패턴은 코드내의 조건문들을 대체하려는 목적으로 사용됩니다.

상태 패턴을 사용하는 이유

패턴을 쓰지 않으면, 클래스에는 다음 요소들이 있을 것입니다.

  1. 상태를 담는 변수
  2. 상태를 결정하는 set 메소드
  3. 상태에 따라 행동하는 메소드 :  switch문 또는 if else 체인

TV를 켜고 끄는 상황을 생각해봅니다.

  • TV 전원이 켜진 상태에서 전원 버튼을 누르면, 전원을 끈다.
  • TV 전원이 꺼진 상태에서 전원 버튼을 누르면, 전원을 켠다.

여기에 절전 상태추가되면 상태를 참조하는 메소드가 다 바뀌어야 합니다.

그리고 다른 클래스의 상태를 참조하는 메소드들도 다 바뀌어야 합니다.

사용법

  • 스테이트 패턴을 적용하면 On/Off/Saving 상태를 클래스로 정의합니다.
  • 이들을 하나의 인터페이스(타입)으로 묶습니다.
  • Laptop이 상태 인터페이스의 메서드를 호출합니다.
  • 각 상태 클래스에서 정의된 행위가 수행됩니다.

전원 상태 인터페이스

public interface PowerState {
    public void powerPush();
}

인터페이스를 구현한 각 상태 클래스들

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

이어서 Laptop 클래스를 정의

public class Laptop {
    private PowerState powerState;

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

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

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

Laptop 클래스는 이제 상태를 분기하는 코드가 사라지고, 인터페이스의 powerPush() 메서드를 호출하기만 합니다.

Laptop 객체를 사용하는 Client 클래스를 정의

public class Client {
    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();
    }
}
  • 굳이 사용을 구분 하자면, 전략 패턴은 상속을 대체하려는 목적
  • 스테이트 패턴은 코드내의 조건문들을 대체하려는 목적으로 사용됩니다.
반응형

댓글