状态模式
来源:互联网 发布:爷爷9岁被鬼子杀了知乎 编辑:程序博客网 时间:2024/06/05 12:39
状态模式允许对象在对象内部状态改变时改变它的行为,对象看起来好像修改了他的类
现在又一个糖果机,我们需要写程序来控制它的出售行为,如图
当然我们可以用一堆if,else语句俩控制它。但是如果程序需要加入其他的状态,那么整个程序就会变得越来越乱。这时我们需要状态模式来重构程序。
java代码
// 状态接口public interface State { void insertCoin(); void ejectCoin(); void turnCrank(); void dispense();}// 没有投币状态public class NoCoinState implements State { private GumballMachine machine; public NoCoinState(GumballMachine machine) { this.machine = machine; } @Override public void insertCoin() { machine.setState(machine.getHasCoinState()); System.out.println("Your inserted a coin"); } @Override public void ejectCoin() { System.out.println("Your have not inserted a coin"); } @Override public void turnCrank() { System.out.println("You turned, but there is no coin"); } @Override public void dispense() { System.out.println("You need to pay first"); }}// 已投币状态public class HasCoinState implements State { private GumballMachine machine; public HasCoinState(GumballMachine machine) { this.machine = machine; } @Override public void insertCoin() { System.out.println("You can not insert another coin"); } @Override public void ejectCoin() { machine.setState(machine.getNoCoinState()); System.out.println("Coin returned"); } @Override public void turnCrank() { machine.setState(machine.getSoldState()); System.out.println("You turned ... "); } @Override public void dispense() { System.out.println("No gumball dispensed"); }}// 已出售状态(正在出货)public class SoldState implements State { private GumballMachine machine; public SoldState(GumballMachine machine) { this.machine = machine; } @Override public void insertCoin() { System.out.println("Please wait, we are already giving you a gumball"); } @Override public void ejectCoin() { System.out.println("Sorry, you already turned the crank"); } @Override public void turnCrank() { System.out.println("Turning twice does not get you another gumball!"); } @Override public void dispense() { if (machine.getGumballNum() > 0) { machine.setGumballNum(machine.getGumballNum() - 1); machine.setState(machine.getNoCoinState()); System.out.println("A gumball comes rolling out the slot ... "); } if (machine.getGumballNum() <= 0) { machine.setState(machine.getSoldOutState()); System.out.println("Oops, out of gumballs!"); } }}// 售罄状态public class SoldOutState implements State { private GumballMachine machine; public SoldOutState(GumballMachine machine) { this.machine = machine; } @Override public void insertCoin() { System.out.println("You can not insert a coin, this machine is sold out"); } @Override public void ejectCoin() { System.out.println("Your have not inserted a coin"); } @Override public void turnCrank() { System.out.println("You turned, but there are no gumballs"); } @Override public void dispense() { System.out.println("No gumball dispensed"); }}// 测试类public class Test { public static void main(String[] args) { new Test().test(); } private void test() { GumballMachine machine = new GumballMachine(5); machine.insertCoin(); machine.turnCrank(); }}
注:
- 当糖果的状态改变的时候,他的所有行为都已经改变
参考文章
1. Head First 设计模式
0 0
- 状态模式(状态变化)
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- python leetcode38 递归
- 深入理解C++中的深拷贝与浅拷贝
- 面试笔试题目(参考)
- ANSYS中Beam188\Beam189单元命令流提取最大应力
- 如何判断Linux的tar.gz是二进制文件还是源码文件
- 状态模式
- oracle 排序是,如果为null, 降序则排在最前面,怎么让这些null值排在最后面。 Nulls last
- C++对象的构造顺序
- CentOS通过YUM升级centOS内核
- iFunk成为最受学生喜爱的笔记本之一
- 并行和并发区别
- grep 常用命令
- Tesseract Ocr 引擎识别图形验证码
- 支付宝的warning: (arm64)...: No such file or directory警告 和 #include <openssl/rsa.h> 'openssl/rsa.h' file