Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-15.log failed

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
study:java:design_pattern:state [2008/09/20 05:45] bananastudy:java:design_pattern:state [2010/10/16 02:09] (現在) banana
行 39: 行 39:
  
 스테이트 패턴은 컨텍스트 객체에 수많은 조건문을 집어넣는 대신에 사용할 수 있는 패턴이라고 생각하면 됩니다. 스테이트 패턴은 컨텍스트 객체에 수많은 조건문을 집어넣는 대신에 사용할 수 있는 패턴이라고 생각하면 됩니다.
-행동을 상태 객체 내에 캡슐화시키면 컨텍스트 내의 상태 객체를 바꾸는 것만으로도 컨텍스트 객에츼 행동을+행동을 상태 객체 내에 캡슐화시키면 컨텍스트 내의 상태 객체를 바꾸는 것만으로도 컨텍스트 객체의 행동을
 바꿀 수 있으니까요. 바꿀 수 있으니까요.
 +
  
  
行 46: 行 47:
 스테이트 패턴을 적용한 예로 뽑기 기계(%%Gumball Machine%%)를 살펴보겠습니다. 스테이트 패턴을 적용한 예로 뽑기 기계(%%Gumball Machine%%)를 살펴보겠습니다.
 먼저 클래스 다이어그램을 살펴볼까요? 먼저 클래스 다이어그램을 살펴볼까요?
- 
 {{:study:java:design_pattern:gumballmachine.jpg|Gumball Machine}} {{:study:java:design_pattern:gumballmachine.jpg|Gumball Machine}}
  
 스테이트 패턴 클래스 다이어그램에서 Context에 해당하는 것이 %%GumballMachine%% 클래스입니다. 스테이트 패턴 클래스 다이어그램에서 Context에 해당하는 것이 %%GumballMachine%% 클래스입니다.
 +
  
 ===== GumballMachine Class ===== ===== GumballMachine Class =====
行 123: 行 124:
         return winnerState;         return winnerState;
     }     }
 +}
 +</code>
 +
 +===== NoQuarterState Calss =====
 +상태를 구현해 볼 때가 되었습니다. 우선 **%%NoQuarterState%%**부터 시작해 봅시다.
 +<code java>
 +public class NoQuarterState implements State {
 +    GumballMachine gumballMachine;
 +
 +    public NoQuraterState(GumballMachine gumballMachine) {
 +        this.gumballMachine = gumballMachine;
 +    }
 +
 +    public void insertQuarter() {
 +        System.out.println("동전을 넣으셨습니다.");
 +        gumballMachine.setState(gumballMachine.getHasQuarterState());
 +    }
 +
 +    public void ejectQuarter() {
 +        System.out.println("동전을 넣어주세요.");
 +    }
 +
 +    public void turnCrank() {
 +        System.out.println("동전을 넣어주세요.");
 +    }
 +
 +    public void dispense() {
 +        System.out.println("동전을 넣어주세요.");
 +    }
 +}
 +</code>
 +
 +
 +
 +===== HasQuarterState Class =====
 +이제 **%%GumballMachine%%** 클래스하고 상태 클래스가 어떤 식으로 맞물려 돌아가는지 어느 정도
 +감히 잡힐 것 같군요. 그럼 **%%HasQuarterState%%**와 **%%SoldSate%%** 클래스도 구현해 볼까요?
 +<code java>
 +public class HasQuarterState implements State {
 +     Random randomWinner = new Random(System.currentTimeMillis());
 +     GumballMachine gumballMachine;
 +
 +     public HasQuarterState(GumballMachine gumballMachine) {
 +        this.gumballMachine = gumballMachine;
 +     }
 +
 +     public void insertQuarter() {
 +        System.out.println("동전은 한 개만 넣어주세요.");
 +     }
 +
 +     public void ejectQuarter() {
 +        System.out.println("동전이 반환됩니다.");
 +        gumballMachine.setState(gumballMachie.getNoQuarterState());
 +     }
 +
 +     public void turnCrank() {
 +        System.out.println("손잡이를 돌리셨습니다.");
 +        int winner = randomWinner.nextInt(10);
 +        if((winner==0) && (gumballMachine.getCount() > 1)) {
 +           gumballMachine.setState(gumballMachine.getWinnerState());
 +        } else {
 +           gumballMachine.setState(gumballMachine.getSoldState());
 +        }
 +     }
 +
 +     public void dispense() {
 +        System.out.println("알맹이가 나갈 수 없습니다.");
 +     }
 +}
 +</code>
 +
 +
 +
 +===== SoldState Class =====
 +**%%SolidState%%** 클래스도 살펴봅시다.
 +<code java>
 +public class SolidState implements State {
 +     GumballMachine gumballMachine;
 +
 +     public SolidState(GumballMachine gumballMachine) {
 +         this.gumballMachine = gumballMachine;
 +     }
 +
 +     public void insertQuarter() {
 +         System.out.println("잠시만 기다려 주세요. 알맹이가 나가고 있습니다.");
 +     }
 +
 +     public void ejectQuarter() {
 +         System.out.println("이미 알맹이를 뽑으셨습니다.");
 +     }
 +
 +     public void turnCrank() {
 +         System.out.println("손잡이는 한 번만 돌려주세요.");
 +     }
 +
 +     public void dispense() {
 +         gumballMachine.releaseBall();
 +         if (gumballMachine.getCount() > 0) {
 +             gumballMachine.setState(gumballMachine.getNoQuarterState());
 +         } else {
 +             System.out.println("Oopse, out of gumballs!.");
 +             gumballMachine.setState(gumballMachine.getSoldState());
 +         }
 +     }
 +}
 +</code>
 +===== SoldOutState Class =====
 +<code java>
 +public class SoldOutState implements State {
 +    GumballMachine gumballMachine;
 +
 +    public SoldOutState(GumballMachine gumballMachine) {
 +         this.gumballMachine = gumballMachine;
 +    }
 +
 +    public void insertQuarter() {
 +         System.out.println("죄송합니다. 매진되었습니다.");
 +    }
 +
 +    public void ejectQuarter() {
 +         System.out.println("죄송합니다. 매진되었습니다.");
 +    }
 +
 +    public void turnCrank() {
 +         System.out.println("죄송합니다. 매진되었습니다.");
 +    }
 +
 +    public void dispense() {
 +         System.out.println("죄송합니다. 매진되었습니다.");
 +    }
 +}
 +</code>
 +===== WinnerState Class =====
 +<code java>
 +public class WinnerState implements State {
 +     GumballState gumballState;
 +
 +     public WinnerState(GumballState gumballState) {
 +         this.gumballState = gumballState;
 +     }
 + 
 +     public void insertQuarter() {
 +         System.out.println("이미 알맹이를 뽑으셨습니다.");
 +     }
 +
 +     public void ejectQuarter() {
 +         System.out.println("이미 알맹이를 뽑으셨습니다.");
 +     }
 +
 +     public void turnCrank() {
 +         System.out.println("이미 알맹이를 뽑으셨습니다.");
 +     }
 +
 +     public void dispense() {
 +         System.out.println("축하드립니다! 알맹이를 하나 더 받으실 수 있습니다.");
 +         gumballMachine.releaseBall();
 +         if (gumballMachine.getCount() == 0) {
 +             gumballMachine.setState(gumballMachine.getSoldOutState());
 +         } else {
 +             System.out.println("더 이상 알맹이가 없습니다.");
 +             gumballMachine.setState(gumballMachine.getSoldOutState());
 +         }
 +     }
 } }
 </code> </code>
  

QR Code
QR Code study:java:design_pattern:state (generated for current page)