-
행위 패턴 - 상태 패턴 (State Pattern)Java/디자인패턴 2024. 11. 9. 14:53반응형
**상태 패턴 (State Pattern)**은 객체의 상태에 따라 행동을 변경하는 디자인 패턴입니다. 상태 패턴은 객체의 내부 상태가 바뀔 때 객체의 행동이 마치 클래스를 바꾸는 것처럼 변경되도록 합니다. 이를 통해 코드의 가독성과 유연성을 높일 수 있으며, 복잡한 조건문을 대체하는 데 유용합니다.
예시 설명
자판기를 예시로 들어보겠습니다. 자판기는 여러 상태를 가질 수 있습니다. 예를 들어 "동전 투입 대기", "음료 선택 대기", "음료 제공 중" 등의 상태가 있습니다. 상태 패턴을 사용하면 이러한 상태를 객체로 정의하고, 자판기의 행동이 상태에 따라 다르게 작동하도록 할 수 있습니다.
JAVA로 상태 패턴 구현 예시
다음은 자판기의 간단한 상태 패턴 예제입니다.
- State 인터페이스 - 자판기 상태에서 수행할 행동을 정의
- ConcreteState 클래스 - 상태별로 구체적인 행동을 구현
- Context 클래스 - 현재 상태를 관리하고 행동을 수행
1. State 인터페이스 정의
interface VendingMachineState { void insertCoin(); void selectItem(); void dispenseItem(); }
2. ConcreteState 클래스 구현
class NoCoinState implements VendingMachineState { @Override public void insertCoin() { System.out.println("동전이 투입되었습니다. 음료를 선택하세요."); } @Override public void selectItem() { System.out.println("동전이 없습니다. 동전을 먼저 투입해 주세요."); } @Override public void dispenseItem() { System.out.println("동전이 없습니다. 동전을 먼저 투입해 주세요."); } } class HasCoinState implements VendingMachineState { @Override public void insertCoin() { System.out.println("이미 동전이 있습니다. 음료를 선택해 주세요."); } @Override public void selectItem() { System.out.println("음료를 선택했습니다. 음료가 나옵니다."); } @Override public void dispenseItem() { System.out.println("음료가 나왔습니다."); } }
3. Context 클래스 구현
class VendingMachine { private VendingMachineState noCoinState; private VendingMachineState hasCoinState; private VendingMachineState currentState; public VendingMachine() { noCoinState = new NoCoinState(); hasCoinState = new HasCoinState(); currentState = noCoinState; } public void setState(VendingMachineState state) { this.currentState = state; } public void insertCoin() { currentState.insertCoin(); if (currentState instanceof NoCoinState) { setState(hasCoinState); } } public void selectItem() { currentState.selectItem(); if (currentState instanceof HasCoinState) { setState(noCoinState); } } public void dispenseItem() { currentState.dispenseItem(); } }
4. 사용 예시
public class Main { public static void main(String[] args) { VendingMachine vendingMachine = new VendingMachine(); // 동전 없이 음료 선택 시도 vendingMachine.selectItem(); // 동전 투입 후 음료 선택 vendingMachine.insertCoin(); vendingMachine.selectItem(); // 동전 투입 상태에서 또 동전 투입 시도 vendingMachine.insertCoin(); } }
결과
이 코드는 각 상태에 따라 자판기의 동작이 다르게 나타납니다. 상태를 객체로 분리하여 각기 다른 상태별로 행동을 정의했기 때문에, 자판기의 상태에 따라 행동을 쉽게 수정하거나 추가할 수 있습니다.
반응형'Java > 디자인패턴' 카테고리의 다른 글
구조 패턴- 브릿지(Bridge) 패턴 (0) 2024.11.11 구조 패턴 - 어댑터(Adapter) 패턴 (0) 2024.11.10 생성 패턴 - Singleton 패턴 (0) 2024.11.08 템플릿 메소드 패턴(Template Method Pattern) (0) 2024.11.07 Behavioral Design Pattern - Strategy(전략) 파헤치기 (0) 2024.10.25