디자인 모드 명령 (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;}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.