728x90
Overview
상태 디자인 패턴은 객체 내부의 상태에 따라 동작을 변경하기 위해 사용하는 디자인 패턴입니다.
장점
- 하나의 객체에 대해 여러 액션을 구현해야 하는 경우 상태 객체만 수정되므로 작업을 추가, 삭제 및 수정합니다.
- 상태 패턴을 사용하면 객체의 상태에 따라 조건문을 줄여 코드를 간결하고 가독성 있게 만듭니다.
불리
- 조건문을 대체하는 조건의 조건을 조건에 따라 증가시키면 관리할 클래스의 수가 증가합니다.
Structure
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
'Java Design Pattern' 카테고리의 다른 글
[ENG][디자인패턴]Composite 패턴 이론과 설명 (0) | 2022.06.07 |
---|---|
[ENG][디자인패턴]Adapter 패턴 이론과 설명 (0) | 2022.06.06 |
[ENG][디자인패턴]Template Method 패턴 이론과 설명 (0) | 2022.06.04 |
[ENG][디자인패턴]Strategy 패턴 이론과 설명 (0) | 2022.06.03 |
[ENG][디자인패턴]Singleton 패턴 이론과 설명 (0) | 2022.06.01 |
[ENG][디자인패턴]Observer 패턴 이론과 설명 (0) | 2022.05.31 |
[ENG][디자인패턴]MVC 패턴 이론과 설명 (0) | 2022.05.30 |
[ENG][디자인패턴]Mediator 패턴 이론과 설명 (0) | 2022.05.27 |