您的位置:首页 > 编程语言

设计模式之状态模式案例代码

2013-04-15 00:07 615 查看
转载请注明出处:http://blog.csdn.net/droyon/article/details/8801887

状态模式:允许对象在内部改变时改变它的行为,对象看起来好像修改了它的类。

将状态封装成为对立的类,并将动作委托给当前状态的对象。

对象在运行过程中,会完全改变他的行为,好像另一个对象一样。

案例情景:

ATM机在我们的生活中随处可见,我们只需插入银行卡,输入密码,输入取款金额,取走现金。就ok了,方便了我们的生活。我们现在就来模拟这个过程,最后“拿钱走我”

1、State.java

public interface State {
public void takeCash();//取走现金
public void insertCard();//插入银行卡
public void inputPassword();//输入银行卡密码
public void inputCashCount(int num);//输入取款金额
}
2、InsertCardState.java

public class InsertCardState implements State{
ATMMachine mAtmMachine;

public InsertCardState(ATMMachine atm){
mAtmMachine = atm;
}

@Override
public void takeCash() {
System.out.println("请插入银行卡");
}

@Override
public void insertCard() {
System.out.println("正在插入银行卡");
mAtmMachine.setmState(mAtmMachine.getInputPasswordState());
}

@Override
public void inputCashCount(int num) {
System.out.println("请插入银行卡");
}

@Override
public void inputPassword() {
System.out.println("请插入银行卡");
}

}


3、InputPasswordState.java

public class InputPasswordState implements State{
ATMMachine mAtmMachine;

public InputPasswordState(ATMMachine atm){
mAtmMachine = atm;
}

@Override
public void takeCash() {
System.out.println("请输入银行卡密码");
}

@Override
public void insertCard() {
System.out.println("请输入银行卡密码");
}

@Override
public void inputCashCount(int num) {
System.out.println("请输入银行卡密码");
}

@Override
public void inputPassword() {
System.out.println("输入银行卡密码,正确");
mAtmMachine.setmState(mAtmMachine.getInputCashCountState());
}

}


4、InputCashCountState.java

public class InputCashCountState implements State{
ATMMachine mAtmMachine;

public InputCashCountState(ATMMachine atm){
mAtmMachine = atm;
}

@Override
public void takeCash() {
System.out.println("请输入取款金额");
}

@Override
public void insertCard() {
System.out.println("请输入取款金额");
}

@Override
public void inputCashCount(int num) {
System.out.println("已输入取款金额,正在出钞");
mAtmMachine.setCashCount(num);
mAtmMachine.setmState(mAtmMachine.getTakeCashState());
}

@Override
public void inputPassword() {
System.out.println("请输入取款金额");
}

}


5、TakeCashState.java

public class TakeCashState implements State{
ATMMachine mAtmMachine;

public TakeCashState(ATMMachine atm){
mAtmMachine = atm;
}

@Override
public void takeCash() {
System.out.println("钞票已出,请取走钞票"+mAtmMachine.getCashCount()+"元");
mAtmMachine.setmState(mAtmMachine.getInsertCardState());
}

@Override
public void insertCard() {
System.out.println("你已经插入银行卡,钱已出,请取走钱");
}

@Override
public void inputCashCount(int num) {
System.out.println("钱已出,请取走钱:");
}

@Override
public void inputPassword() {
System.out.println("钱已出,请取走钱");
}

}


6、ATMMachine.java

public class ATMMachine {
private State takeCashState;
private State insertCardState;
private State inputCashCountState;
private State inputPasswordState;

private State mState;

private int cashCount;

public ATMMachine(){
takeCashState = new TakeCashState(this);
insertCardState = new InsertCardState(this);
inputCashCountState = new InputCashCountState(this);
inputPasswordState = new InputPasswordState(this);
mState = insertCardState;
}

public void insertCard(){
mState.insertCard();
}

public void takeCash(){
mState.takeCash();
}

public void inputCashCount(int num){
mState.inputCashCount(num);
}

public void inputPassword(){
mState.inputPassword();
}

public State getTakeCashState() {
return takeCashState;
}

public State getInsertCardState() {
return insertCardState;
}

public State getInputCashCountState() {
return inputCashCountState;
}

public void setmState(State mState) {
this.mState = mState;
}

public State getInputPasswordState() {
return inputPasswordState;
}

public int getCashCount() {
return cashCount;
}

public void setCashCount(int cashCount) {
this.cashCount = cashCount;
}

}


7、Test.java

public class Test {
public static void main(String args[]){
ATMMachine atm = new ATMMachine();

System.out.println("拿钱走我");
atm.takeCash();//直接取钱走人,这不是抢吗?当然不行
System.out.println("------------------------------------");

System.out.println("想的太好了,怎么可能那,先需要插入银行卡");
atm.insertCard();
System.out.println("------------------------------------");

System.out.println("现在可以取钱走我了吧");
atm.takeCash();
System.out.println("------------------------------------");

System.out.println("想的还是太好了,需要输入密码");
atm.inputPassword();
System.out.println("------------------------------------");

System.out.println("现在可以拿钱走我了吧,等等,还需要输入多少钱");
atm.inputCashCount(2000);
System.out.println("------------------------------------");

System.out.println("现在可以拿钱走我了吧");
atm.takeCash();
}
}


输出结果:

拿钱走我
请插入银行卡
------------------------------------
想的太好了,怎么可能那,先需要插入银行卡
正在插入银行卡
------------------------------------
现在可以取钱走我了吧
请输入银行卡密码
------------------------------------
想的还是太好了,需要输入密码
输入银行卡密码,正确
------------------------------------
现在可以拿钱走我了吧,等等,还需要输入多少钱
已输入取款金额,正在出钞
------------------------------------
现在可以拿钱走我了吧
钞票已出,请取走钞票2000元


总结:

状态模式允许随着状态的改变,改变状态的行为。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  状态模式