Overview

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

장점
   - 하나의 객체에 대해 여러 액션을 구현해야 하는 경우 상태 객체만 수정되므로 작업을 추가, 삭제 및 수정합니다.
   - 상태 패턴을 사용하면 객체의 상태에 따라 조건문을 줄여 코드를 간결하고 가독성 있게 만듭니다.

불리
   - 조건문을 대체하는 조건의 조건을 조건에 따라 증가시키면 관리할 클래스의 수가 증가합니다.

 

Structure

https://ko.wikipedia.org/wiki/%EC%83%81%ED%83%9C_%ED%8C%A8%ED%84%B4

 

Code Example

package com.example.design.pattern;

interface State {
	public void insertQuarter();

	public void ejectQuarter();

	public void turnCrank();

	public void dispense();
}

class NoQuarterState implements State {

	GumballMachine gumballMachine;

	public NoQuarterState(GumballMachine gumballMachine) {
		this.gumballMachine = gumballMachine;
	}

	public void insertQuarter() {
		System.out.println("insertQuarter");
		gumballMachine.setState(gumballMachine.getHasQuarterState());
	}

	public void ejectQuarter() {
		System.out.println("ejectQuarter");
	}

	public void turnCrank() {
		System.out.println("turnCrank");
	}

	public void dispense() {
		System.out.println("dispense");
	}

	public String toString() {
		return "NoQuarterState";
	}
}

class SoldOutState implements State {
	private GumballMachine gumballMachine;

	public SoldOutState(GumballMachine gumballMachine) {
		this.gumballMachine = gumballMachine;
	}

	public void insertQuarter() {
		System.out.println("insertQuarter");
	}

	public void ejectQuarter() {
		System.out.println("ejectQuarter");
	}

	public void turnCrank() {
		System.out.println("turnCrank");
	}

	public void dispense() {
		System.out.println("dispense");
	}

	public String toString() {
		return "toString";
	}
}

class HasQuarterState implements State {

	private GumballMachine gumballMachine;

	public HasQuarterState(GumballMachine gumballMachine) {
		this.gumballMachine = gumballMachine;
	}

	public void insertQuarter() {
		System.out.println("insertQuarter");
	}

	public void ejectQuarter() {
		System.out.println("ejectQuarter");
		gumballMachine.setState(gumballMachine.getNoQuarterState());
	}

	public void turnCrank() {
		System.out.println("turnCrank");
		gumballMachine.setState(gumballMachine.getSoldState());
	}

	public void dispense() {
		System.out.println("dispense");
	}

	public String toString() {
		return "HasQuarterState";
	}
}

class SoldState implements State {
	private GumballMachine gumballMachine;

	public SoldState(GumballMachine gumballMachine) {
		this.gumballMachine = gumballMachine;
	}

	public void insertQuarter() {
		System.out.println("insertQuarter");
	}

	public void ejectQuarter() {
		System.out.println("ejectQuarter");
	}

	public void turnCrank() {
		System.out.println("turnCrank");
	}

	public void dispense() {
		gumballMachine.releaseBall();
		if (gumballMachine.getCount() > 0) {
			gumballMachine.setState(gumballMachine.getNoQuarterState());
		} else {
			System.out.println("Oops!! out of gumballs!!");
			gumballMachine.setState(gumballMachine.getSoldOutState());
		}
	}

	public String toString() {
		return "GumballMachine";
	}
}

class GumballMachine {
	State soldOutState;
	State noQuarterState;
	State hasQuarterState;
	State soldState;

	public State getSoldOutState() {
		return soldOutState;
	}

	public State getNoQuarterState() {
		return noQuarterState;
	}

	public State getHasQuarterState() {
		return hasQuarterState;
	}

	public State getSoldState() {
		return soldState;
	}

	State currentState = soldOutState;
	int count = 0;

	public int getCount() {
		return count;
	}

	public GumballMachine(int numberGumaballs) {
		soldOutState = new SoldOutState(this);
		noQuarterState = new NoQuarterState(this);
		hasQuarterState = new HasQuarterState(this);
		soldState = new SoldState(this);

		this.count = numberGumaballs;
		if (numberGumaballs > 0) {
			currentState = noQuarterState;
		}
	}

	public void insertQuarter() {
		currentState.insertQuarter();
	}

	public void ejectQuarter() {
		currentState.ejectQuarter();
	}

	public void turnCrank() {
		currentState.turnCrank();
	}

	public void dispense() {
		currentState.dispense();
	}

	void setState(State state) {
		this.currentState = state;
	}

	void releaseBall() {
		System.out.println("releaseBall");
		if (count != 0) {
			count = count - 1;
		}
	}

	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("\nMighty Gumball, Inc.");
		sb.append("\nJava-enabled Standing Gumball Model #2004");
		sb.append("\nInventory: " + count + " gumball");
		if (count != 1) {
			sb.append("s");
		}

		sb.append("\nMachine is " + currentState + "\n");
		return sb.toString();
	}
}

public class MyState {
	public static void main(String[] args) {
		GumballMachine gumballMachine = new GumballMachine(5);
		System.out.println(gumballMachine);

		gumballMachine.insertQuarter();
		gumballMachine.turnCrank();

		System.out.println(gumballMachine);

		gumballMachine.insertQuarter();
		gumballMachine.ejectQuarter();
		gumballMachine.turnCrank();
		gumballMachine.dispense();

		System.out.println(gumballMachine);
	}
}

 

Console Result

Mighty Gumball, Inc.
Java-enabled Standing Gumball Model #2004
Inventory: 5 gumballs
Machine is NoQuarterState

insertQuarter
turnCrank

Mighty Gumball, Inc.
Java-enabled Standing Gumball Model #2004
Inventory: 5 gumballs
Machine is GumballMachine

insertQuarter
ejectQuarter
turnCrank
releaseBall

Mighty Gumball, Inc.
Java-enabled Standing Gumball Model #2004
Inventory: 4 gumballs
Machine is NoQuarterState

 

Conclusion

N/A

728x90
1
반응형

+ Recent posts