시냅스

State Pattern - java로 구현 본문

디자인 패턴

State Pattern - java로 구현

ted k 2022. 8. 2. 19:30

스테이트 패턴  State Pattern

  • 클래스가 하나의 상태에 따라 그 내부의 여러 메서드의 기능이 바뀐다고 하면 이를 각각의 클래스로 분리한다.

 

의도와 동기

  • 객체의 기능은 상태에 따라 달라질 수 있는데, 이러한 상태가 여러가지이고, 클래스 전반의 모든 기능이 상태에 의존적이라 하면, 상태를 클래스로 표현하는 것이 적절함
  • 클래스로 분리하지 않게 되면 상태가 여러가지인 경우 많은 if-else 문이 사용되고 추후 상태가 추가되거나 삭제될 때 수정해야 하는 사항이 너무 많아짐

 

 

  • Context : ConcreteState의 인스턴스를 관리하고 서로 상태가 바뀌는 순간을 구현할 수 있다.
  • State : Context 가 사용할 메서드를 선언한다.
  • ConcreateState : 각 상태 클래스가 수행할 State에 선언된 메서드를 구현한다.

결론

 

  • 상태에 따른 기능을 분리하여 구현
  • 새로운 상태가 추가되면 새로운 클래스를 추가한다.
  • 각 상태의 switch를 명확하게 구현해 함

 

구현

package statepattern;

interface PlayerLevel {
    public void run();
    public void jump();
    public void turn();
    public void showLevelMessage();
}

class Beginner implements PlayerLevel {

    @Override
    public void run() {
        System.out.println("천천히 달립니다..");
    }

    @Override
    public void jump() {
        System.out.println("Jump 할 줄 모르지롱.");
    }

    @Override
    public void turn() {
        System.out.println("turn 할 줄 모르지롱");
    }

    @Override
    public void showLevelMessage() {
        System.out.println("Beginner");
    }
}

class Advanced implements PlayerLevel {

    @Override
    public void run() {
        System.out.println("빨리 달립니다.");
    }

    @Override
    public void jump() {
        System.out.println("높이 Jump 합니다.");
    }

    @Override
    public void turn() {
        System.out.println("turn 할 줄 모르지롱");
    }

    @Override
    public void showLevelMessage() {
        System.out.println("Advanced");
    }
}

class Super implements PlayerLevel {

    @Override
    public void run() {
        System.out.println("아주 빨리 달립니다.");
    }

    @Override
    public void jump() {
        System.out.println("아주 높이 jump 합니다.");
    }

    @Override
    public void turn() {
        System.out.println("한 바퀴 돕니다..");
    }

    @Override
    public void showLevelMessage() {
        System.out.println("Super");
    }
}

class Player {

    PlayerLevel pl;

    public Player() {
        this.pl = new Beginner();
    }

    public void play(int time) {
        pl.run();
        for (int i = 0; i < time; i++) {
            pl.jump();
        }
        pl.turn();
    }

    public void upgradeLevel(int level) {
        if (level == 1)
            return ;
        else if (level == 2)
            this.pl = new Advanced();
        else if (level == 3)
            this.pl = new Super();
    }
}

public class StatePattern {
    public static void main(String[] args) {
        Player player = new Player();
        player.play(1);
        System.out.println();

        player.upgradeLevel(2);
        player.play(2);
        System.out.println();

        player.upgradeLevel(3);
        player.play(3);
    }
}

 

 

Comments