ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 행위 패턴 - 상태 패턴 (State Pattern)
    Java/디자인패턴 2024. 11. 9. 14:53
    반응형

    **상태 패턴 (State Pattern)**은 객체의 상태에 따라 행동을 변경하는 디자인 패턴입니다. 상태 패턴은 객체의 내부 상태가 바뀔 때 객체의 행동이 마치 클래스를 바꾸는 것처럼 변경되도록 합니다. 이를 통해 코드의 가독성과 유연성을 높일 수 있으며, 복잡한 조건문을 대체하는 데 유용합니다.

    예시 설명

    자판기를 예시로 들어보겠습니다. 자판기는 여러 상태를 가질 수 있습니다. 예를 들어 "동전 투입 대기", "음료 선택 대기", "음료 제공 중" 등의 상태가 있습니다. 상태 패턴을 사용하면 이러한 상태를 객체로 정의하고, 자판기의 행동이 상태에 따라 다르게 작동하도록 할 수 있습니다.

    JAVA로 상태 패턴 구현 예시

    다음은 자판기의 간단한 상태 패턴 예제입니다.

    1. State 인터페이스 - 자판기 상태에서 수행할 행동을 정의
    2. ConcreteState 클래스 - 상태별로 구체적인 행동을 구현
    3. 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();
        }
    }

    결과

    이 코드는 각 상태에 따라 자판기의 동작이 다르게 나타납니다. 상태를 객체로 분리하여 각기 다른 상태별로 행동을 정의했기 때문에, 자판기의 상태에 따라 행동을 쉽게 수정하거나 추가할 수 있습니다.

    반응형

    댓글

Designed by Tistory.