디자인 모드 명령 (State) 모드

더 읽 기
     상태 모드 는 프로그램 개발 에 자주 사용 되 는 모델 이다.응용 하지 않 고 업무 기능 을 실현 한다 면.그럼 너 도 틀림없이 상태 모드 의 길 로 갔 을 거 야. 단지 네가 느끼 지 못 했 을 뿐 이 야.그것 의 실현 은 대상 의 내부 상태 변화 에 따라 해당 하 는 기능 을 자동 으로 수행 하 는 것 이다.긴 말 하지 않 겠 습 니 다. 소스 코드 를 보 세 요. 이것 도 제 가 디자인 모델 을 연구 할 때 본 예 입 니 다. 이 를 중국어 로 번역 하여 한 네티즌 이 알 아 볼 수 있 도록 하 는 것 입 니 다. 수준 이 제한 되 어 있 기 때문에 이 정도 밖 에 안 됩 니 다. 그리고 네티즌 들 이 많이 지적 해 주 셨 으 면 좋 겠 습 니 다. 이것 도 베 낀 것 이 라 고 할 수 있 습 니 다. 하하, 감사합니다.
public class GumballMachine {
	//    4   ,               ,          
    final static int SOLD_OUT = 0;      //         
    final static int NO_QUARTER = 1;    //        
    final static int HAS_QUARTER = 2;   //       
    final static int SOLD = 3;      //       
    //            ,      "    ",                  
    int state = SOLD_OUT;   
    int count = 0;  //                   
    //              ,      0  ,     "   "   ,       
    public GumballMachine(int count) {   
        this.count = count;   
        if (count > 0) {   
            state = NO_QUARTER;   
        }   
    }   
    
  //       ,         
    public void insertQuarter() {   
        if (state == HAS_QUARTER) {   
            //            ,        
            System.out.println("            ");   
        } else if (state == NO_QUARTER) {   
            //    "  25  "    ,     25  ,       " 25  "   
            state = HAS_QUARTER;   
            System.out.println("          ");   
        } else if (state == SOLD_OUT) {   
            //      ,        
            System.out.println("      ,        ");   
        } else if (state == SOLD) {   
            //        ,      ,        ,   "  25  "   
            System.out.println("         ,   ,     。");   
        }   
    }   
    //  ,        25  ...   
    public void ejectQuarter() {   
        if (state == HAS_QUARTER) {   
            //   25  ,   ,  "  25  "      
            System.out.println("    ");   
            state = NO_QUARTER;   
        } else if (state == NO_QUARTER) {   
            //    25  ,         
            System.out.println("   ,     ");   
        } else if (state == SOLD) {   
            //          ,      ,        
        	state = NO_QUARTER;
            System.out.println("   ,          。");   
        } else if (state == SOLD_OUT) {   
            //      ,      25  ,           
            System.out.println("   ,          ");   
        }   
    }   
  //        ...   
    public void turnCrank() {   
        if (state == SOLD) {   
            //       2      
            System.out.println("      ");   
        } else if (state == NO_QUARTER) {   
            //       25     
            System.out.println("            ");   
        } else if (state == SOLD_OUT) {   
            //        
            System.out.println("         ,       。");   
        } else if (state == HAS_QUARTER) {   
            //  !      .     "    ",       dispense()     
            System.out.println("   ,           ...");   
            state = SOLD;   
            dispense();   
        }   
    }   
    //       
    public void dispense() {   
        if (state == SOLD) {   
            //    "    "     
            System.out.println("          ....");   
            count = count - 1;   
            //       "    "      
            if (count == 0) {//    ,      "    "     
                System.out.println("    !");   
                state = SOLD_OUT;   
            } else {    //    "  25  "      
                state = NO_QUARTER;   
            }   
        } else if (state == NO_QUARTER) {   //        ,         ,                  
            System.out.println("          。。");   
        } else if (state == SOLD_OUT) {   
            System.out.println("       ");   
        } else if (state == HAS_QUARTER) {   
            System.out.println("           。");   
        }   
    }   

}

 
테스트 는 이미 쓴 것 에서 나 온 것 입 니 다. 제 가 아 이 디 어 를 제공 하 는 것 은 바로 페이지 가 몇 개의 스위치 를 제공 하 는 것 입 니 다. 즉, 버튼, checkbox 등 이 그들의 클릭 이벤트 에서 GumballMachine 인 스 턴 스 의 내부 상태 변화 입 니 다.그리고 그 변 화 를 보면 된다.
여러분 눈치 채 지 못 했 습 니 다. 이 코드 는 아직도 '이상 한 맛' 이 있 습 니 다. 이때 업무 가 바 뀌 면 고객 이 당 첨 된 사용자 라면 사탕 기계 가 사탕 두 개 를 뱉 어야 합 니 다. 어떻게 해 야 합 니까?여러 가지 방법 에서 이 상 태 를 더 해 야 하 는 거 아니 야? 또 하나의 if 문 구 를 더 해 야 하 는 거 아니 야? 이것 은 업무 에 변화 가 생 긴 거 야. 만약 에 업무 가 무한 한 변 화 를 하려 면 프로그래머 가 미 치 겠 지? 하하.그래서 재 구성 해 야 겠 어 요.
이 몇 가지 상 태 를 추상 화해 야 한다.여기까지 생각 하고 코드 를 보면 알 수 있 을 거 예요.
public interface State {
	//     
	public void insertQuarter();
	//     
	public void ejectQuarter();
    //      
	public void turnCrank();
    //      
	public void dispense();

}

다음은 이 상태 인 터 페 이 스 를 실현 하 는 몇 가지 실현 유형 이다.
 
public class HasQuarterState implements State{
	GumballMachineTwo gumballMachine;   
    //          ,  10%      
    Random randomWinner = new Random(System.currentTimeMillis());   
    public HasQuarterState(GumballMachineTwo gumballMachine) {   
        this.gumballMachine = gumballMachine;   
    }   
    public void insertQuarter() {   //                  
        System.out.println("      ,     。");   
    }   
    
    public void ejectQuarter() {    //        NoQuarterState   
        System.out.println("    ");
        //               
        gumballMachine.setState(gumballMachine.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("           。");   
    }   

}

public class NoQuarterState implements State {
	GumballMachineTwo gumballMachine;

	//              
	public NoQuarterState(GumballMachineTwo gumballMachine) {
		this.gumballMachine = gumballMachine;
	}

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

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

	}

	//   
	public void insertQuarter() {
		// TODO Auto-generated method stub

	}

	//     
	public void turnCrank() {
		// TODO Auto-generated method stub

	}

}

public class SoldOutState implements State {
	GumballMachineTwo gumballMachine;

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

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

	}

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

	}

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

	}

	public void turnCrank() {
		// TODO Auto-generated method stub

	}

}

public class SoldState implements State{
	GumballMachineTwo gumballMachine;   
    public SoldState(GumballMachineTwo gumballMachine) {   
        this.gumballMachine = gumballMachine;   
    }       
    //  3                  
    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("Oops, out of gumballs!");   
            gumballMachine.setState(gumballMachine.getSoldOutState());   
        }   
    }   

}

public class WinnerState implements State{
	GumballMachineTwo gumballMachine;   
    //    SoldState       
    public WinnerState(GumballMachineTwo gumballMachine) {   
        this.gumballMachine = gumballMachine;   
    }   
    public void insertQuarter() {   
        System.out.println("Please wait, we're already giving you a Gumball");   
    }   
    public void ejectQuarter() {   
        System.out.println("Please wait, we're already giving you a Gumball");   
    }   
    public void turnCrank() {   
        System.out.println("Turning again doesn't get you another gumball!");   
    }   
    //        2   ,    NoQuarterState SoldState   
    public void dispense() {   
        System.out.println("YOU'RE A WINNER! You get two gumballs for your quarter");   
        gumballMachine.releaseBall();   
        if (gumballMachine.getCount() == 0) {   
            gumballMachine.setState(gumballMachine.getSoldOutState());   
        } else {   
            gumballMachine.releaseBall();   
            if (gumballMachine.getCount() > 0) {   
                gumballMachine.setState(gumballMachine.getNoQuarterState());   
            } else {   
                System.out.println("Oops, out of gumballs!");   
                gumballMachine.setState(gumballMachine.getSoldOutState());   
            }   
        }   
    }   

}

 
다음은 새로운 사탕 류:
public class GumballMachineTwo {
	 //            
    State soldOutState;   
    State noQuarterState;   
    State hasQuarterState;   
    State soldState;   
    
    State winnerState;//         ,       
    //      state   
    State state = soldOutState;   
    int count = 0;//         
    public GumballMachineTwo(int numberGumballs) {        
        soldOutState = new SoldOutState(this);  //                  
        noQuarterState = new NoQuarterState(this);   
        hasQuarterState = new HasQuarterState(this);   
        soldState = new SoldState(this);   
        this.count = numberGumballs;   
        if (numberGumballs > 0) {    //    0   ,    noQuarterState   
            state = noQuarterState;   
        }    
    }   
    //          
    public void insertQuarter() {   
        state.insertQuarter();   
    }   
    public void ejectQuarter() {   
        state.ejectQuarter();   
    }   
    //dispense()         ,                  
    public void turnCrank() {   
        state.turnCrank();   
        state.dispense();   
    }   
    //                       
    void setState(State state) {   
        this.state = state;   
    }   
    //         ,  count      1   
    void releaseBall() {   
        System.out.println("A gumball comes rolling out the slot...");   
        if (count != 0) {   
            count = count - 1;   
        }   
    }   
    int getCount() {   
        return count;   
    }   
    void refill(int count) {   
        this.count = count;   
        state = noQuarterState;   
    }   
    public State getState() {return state;}   
    public State getSoldOutState() {return soldOutState;}   
    public State getNoQuarterState() {return noQuarterState;}   
    public State getHasQuarterState() {return hasQuarterState;}   
    public State getSoldState() {return soldState;}   
    public State getWinnerState() {return winnerState;}   

}

좋은 웹페이지 즐겨찾기