设计模式之状态模式案例代码
2013-04-15 00:07
615 查看
转载请注明出处:http://blog.csdn.net/droyon/article/details/8801887
状态模式:允许对象在内部改变时改变它的行为,对象看起来好像修改了它的类。
将状态封装成为对立的类,并将动作委托给当前状态的对象。
对象在运行过程中,会完全改变他的行为,好像另一个对象一样。
案例情景:
ATM机在我们的生活中随处可见,我们只需插入银行卡,输入密码,输入取款金额,取走现金。就ok了,方便了我们的生活。我们现在就来模拟这个过程,最后“拿钱走我”
1、State.java
3、InputPasswordState.java
4、InputCashCountState.java
5、TakeCashState.java
6、ATMMachine.java
7、Test.java
输出结果:
总结:
状态模式允许随着状态的改变,改变状态的行为。
状态模式:允许对象在内部改变时改变它的行为,对象看起来好像修改了它的类。
将状态封装成为对立的类,并将动作委托给当前状态的对象。
对象在运行过程中,会完全改变他的行为,好像另一个对象一样。
案例情景:
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元
总结:
状态模式允许随着状态的改变,改变状态的行为。
相关文章推荐
- 设计模式--之状态模式(附代码)
- 设计模式之原型模式案例代码
- 设计模式----状态模式UML和实现代码
- 设计模式之简单工厂模式学习案例代码
- 设计模式讲解与代码实践(二十一)——状态
- 如何编写优雅的代码:06. 设计模式应用案例(上)
- 如何编写优雅的代码:07. 设计模式应用案例(下)
- 关于JAVA中状态设计模式的讲解示例代码
- 设计模式案例代码之外观模式
- 【JS设计模式】状态模式的代码示例
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---状态模式
- Dreamweaver 8 代码视图状态到设计视图状态转换速度很慢解决方法
- 设计模式—关系在代码中实现
- 设计模式之状态模式——自动售货机
- 绝对精辟,鲜活代码和实例讲授门面设计模式
- 设计模式之状态模式
- 设计模式之单例(singleton)设计模式代码详解
- 设计模式之原型模式代码示例
- Java设计模式编程中的状态模式和策略模式
- 设计模式----模板方法模式UML和实现代码