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

转载请注明出处:http://blog.youkuaiyun.com/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元

总结:

状态模式允许随着状态的改变,改变状态的行为。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hailushijie

您的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值