二十三种设计模式之状态模式

来源:互联网 发布:java行业 编辑:程序博客网 时间:2024/05/17 21:58

状态模式:能根据内部状态变化,改变对象的行为,看起来好像修改了类.

使用场景:

public interface State {


public void insertCoin();
public void returnCoin();
public void turnCrank();
public void dispense();
public void printstate();
}

public class OnReadyState implements State{
private CandyMachine mCandyMachine;

public OnReadyState(CandyMachine candyMachine) {
this.mCandyMachine = candyMachine;
}


@Override
public void insertCoin() {
System.out.println("you have inserted a coin,next,please turn crank!");
mCandyMachine.setState(mCandyMachine.mHasCoin);
}


@Override
public void returnCoin() {
System.out.println("you haven't insterted a coin yet!");
}


@Override
public void turnCrank() {
System.out.println("you turned ,but you haven't inserted a coin!");
}


@Override
public void dispense() {
// TODO Auto-generated method stub

}


@Override
public void printstate() {
System.out.println("*****OnReadyState*****");
}


}


public class HasCoin implements State{


private CandyMachine candyMachine;

public HasCoin(CandyMachine candyMachine) {
this.candyMachine = candyMachine;
}


@Override
public void insertCoin() {
System.out.println("you can't insert another coin!");
}


@Override
public void returnCoin() {
System.out.println("coin return!");
candyMachine.setState(candyMachine.mOnReadyState);
}


@Override
public void turnCrank() {
System.out.println("crank turn ... !");
Random ranwinner = new Random();
int winner = ranwinner.nextInt(10);
if(winner == 0){
candyMachine.setState(candyMachine.mWinnerState);
}else{
candyMachine.setState(candyMachine.mSoldState);
}
}


@Override
public void dispense() {
// TODO Auto-generated method stub

}


@Override
public void printstate() {
System.out.println("*********HasCoin*******");
}


}

public class SoldState implements State{
private CandyMachine candyMachine;
public SoldState(CandyMachine candyMachine) {
this.candyMachine = candyMachine;
}


@Override
public void insertCoin() {
System.out.println("please wait!we are giving you a candy!");
}


@Override
public void returnCoin() {
System.out.println("you haven't inserted a coin yet!");
}


@Override
public void turnCrank() {
System.out.println("we are giving you a candy,turning another get nothing");
}


@Override
public void dispense() {
candyMachine.releaseCandy();
if(candyMachine.getCount()>0){
candyMachine.setState(candyMachine.mOnReadyState);
}else{
System.out.println("Oo,out of candies");
candyMachine.setState(candyMachine.mSoldOutState);
}
}


@Override
public void printstate() {
System.out.println("*********SoldState*******");
}


}

public class WinnerState implements State{
private CandyMachine candyMachine;
public WinnerState(CandyMachine candyMachine) {
this.candyMachine = candyMachine;
}


@Override
public void insertCoin() {
System.out.println("please wait!we are giving you a candy!");
}


@Override
public void returnCoin() {
System.out.println("you haven't inserted a coin yet!");
}


@Override
public void turnCrank() {
System.out.println("we are giving you a candy,turning another get nothing");
}


@Override
public void dispense() {
candyMachine.releaseCandy();
if(candyMachine.getCount()==0){
candyMachine.setState(candyMachine.mSoldOutState);
}else{
System.out.println("you are a winner!you get another candy!");
candyMachine.releaseCandy();
if(candyMachine.getCount()>0){
candyMachine.setState(candyMachine.mOnReadyState);
}else{
System.out.println("Oo,out of candies");
candyMachine.setState(candyMachine.mSoldOutState);
}
}
}


@Override
public void printstate() {
System.out.println("*********WinnerState*******");
}


}

public class SoldOutState implements State{
private CandyMachine candyMachine;
public SoldOutState(CandyMachine candyMachine) {
this.candyMachine = candyMachine;
}


@Override
public void insertCoin() {
// TODO Auto-generated method stub
System.out.println("you can't insert coin,the machine sold out!");
}


@Override
public void returnCoin() {
System.out.println("you can't return,you have't inserted a coin yet!");
}


@Override
public void turnCrank() {
System.out.println("you turned ,but there are no  candies!");
}


@Override
public void dispense() {
// TODO Auto-generated method stub

}


@Override
public void printstate() {
System.out.println("*********SoldOutState*******");
}


}

public class CandyMachine {
State mSoldOutState;
State mOnReadyState;
State mHasCoin;
State mSoldState;
State mWinnerState;
private State state;
private int count = 0;

public CandyMachine(int count) {
this.count = count;
mSoldOutState = new SoldOutState(this);
mOnReadyState = new OnReadyState(this);
mHasCoin = new HasCoin(this);
mSoldState = new SoldState(this);
mWinnerState = new WinnerState(this);
if(count > 0){
state = mOnReadyState;
}else{
state = mSoldOutState;
}
}


public void setState(State state) {
this.state = state;
}

public void insertCoin(){
state.insertCoin();
}

public void returnCoin() {
state.returnCoin();
}

public void turnCrank(){
state.turnCrank();
state.dispense();
}

void releaseCandy(){
if(count > 0){
count = count - 1;
System.out.println(" a candy rolling out!");
}
}

public int getCount(){
return count;
}

public void printState(){
state.printstate();
}
}

public class MainTest {

public static void main(String[] args) {
CandyMachine candyMachine = new CandyMachine(6);

candyMachine.printState();

candyMachine.insertCoin();
candyMachine.printState();

candyMachine.turnCrank();
candyMachine.printState();

candyMachine.insertCoin();
candyMachine.printState();

candyMachine.insertCoin();
candyMachine.turnCrank();
}


}