Head First设计模式学习笔记-------(12)状态模式
来源:互联网 发布:淘宝上货助手 编辑:程序博客网 时间:2024/05/29 15:24
我们今天开门见山吧,我们又接到了一个新的项目,让我们看看这次的项目是什么吧
对于大家学了熟练的开发技巧,看到这么一个项目,是不是内心第一个想法就是------真TM简单。
public class GumballMachine { final static int SOLD_OUT = 0; final static int NO_QUARTER = 1; final static int HAS_QUARTER = 2; final static int SOLD = 3; //以上四个变量用来设计四个状态 int state = SOLD_OUT; //用来追踪当前状态 int count = 0; //用来保存糖果数量 public GumballMachine(int count) { this.count = count; if (count > 0) { state = NO_QUARTER; } } public void insertQuarter () { if (state = HAS_QUARTER) { System.out.println("You can't insert another quarter"); } else if (state = NO_QUARTER) { state = HAS_QUARTER; System.out.println("You inserted a aquarter"); } else if (state = SOLD_OUT) { System.out.println("You can't insert a quarter , the machine if sold out"); } else if (state = SOLD) { System.out.println("Please wait, we're already giving you'a gumball"); } }}因为代码比较明白,就不写入注释,方法也就写了其中一种,另外三个行为这里就省略的,毕竟重点不是这种直接的设计方法。
我们把这个项目交给公司后,公司的CEO又提出了新的需求,是什么呢?
恕我直言,这个要求真的是无语,没办法,毕竟是需求方的要求,只能帮他们实现了,这个时候,就发现我们之前写的代码不怎么易于维护和修改了吧,这个时候我们就需要重新构造他了。
然后我们通过接口定义,设计了一个新的类图:
让我们实现上面这个模式吧。(这里的类图少了一个WinnerState类,就是成功的能有两颗糖,不要在意,我们会在下面的代码中实现的)
State类:
public interface State { public void insertQuarter(); public void ejectQuarter(); public void turnCrank(); public void dispense();}GumballMachine类:
public class GumballMachine { State soldOutState; State noQuarterState; State hasQuarterState; State soldState; State winnerState; //以上是所有的状态 State state = soldOutState; //追踪当前状态 int count = 0; //记录糖果数 public void insertQuarter() { state.insertQuarter(); } public void ejectQuarter() { state.ejectQuarter(); } public void turnCrank() { state.turnCrank(); state.dispense(); //我们不需要单独实现dispense方法,可以把这个方法写入turnCrank里面 } public void setState (State state) { this.state = state; } public void releaseBall() { System.out.println("A gumball comes rolling out the slot..."); if (count != 0) { count = count - 1; } } public State getSoldOutState() { return soldOutState; } public State getNoQuarterState() { return noQuarterState; } public State getHasQuarterState() { return hasQuarterState; } public State getSoldState() { return soldState; } public State getWinnerState() { return winnerState; } public State getState() { return state; } public int getCount() { return count; }}
HasQuarterState类:public class HasQuarterState implements State { GumballMachine gumballMachine; public HasQuarterState(GumballMachine gumballMachine) { this.gumballMachine = gumballMachine; } public void insertQuarter() { System.out.println("You can't insert another quarter"); } public void ejectQuarter() { System.out.println("Quarter returned"); gumballMachine.setState(gumballMachine.getNoQuarterState()); } public void turnCrank() { System.out.println("You turned.."); gumballMachine.setState(gumballMachine.getSoldState()); } public void dispense() { System.out.println("No gumball dispensed"); }}WinnerState类:public class WinnerState implements State { GumballMachine gumballMachine; public WinnerState(GumballMachine gumballMachine) { this.gumballMachine = gumballMachine; } public void insertQuarter() { System.out.println("Please wait, we're already giving you a gumball"); } public void ejectQuarter() { System.out.println("Sorry, you already turned the crank"); } public void turnCrank() { System.out.println("Turning twice doesn't get you another gumball"); } public void dispense() { System.out.println("You're a winner ! you get two gumballs for your quarter"); gumballMachine.releaseBall(); if (gumballMachine.getCount() == 0) { gumballMachine.setState(gumballMachine.getSoldOutState()); } else { gumballMachine.releaseBall(); if (gumballMachine.getCount() > 0) { gumballMachine.setState(gumballMachine.getNoQuarterState()); } else { System.out.println("Oops, out of gumballs"); gumballMachine.setState(gumballMachine.getSoldOutState()); } } }}定义状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。状态模式的类图:
这个类图是不是很熟悉,对,他和策略模式的类图是一样的,他们有什么区别的,让我们来看看吧。
总结:
1:状态模式允许一个对象基于内部状态而拥有不同的行为。
2:状态模式用类代表状态。
3:通过将每个状态封装进一个类,我们把以后需要做的任何改变局部化了。
4:状态模式和策略模式有相同的类图,但是他们的意图不一样。
5:使用状态模式通常会导致设计中类的数目大量增加。
0 0
- Head First设计模式学习笔记-------(12)状态模式
- 《Head First 设计模式》学习笔记——状态模式
- Head First设计模式学习笔记(8)---适配器模式
- Head First设计模式学习笔记-------(1)策略模式
- Head First设计模式学习笔记-------(2)观察者模式
- Head First设计模式学习笔记-------(4.1)工厂模式
- Head First设计模式学习笔记-------(5)单体模式
- Head First设计模式学习笔记-------(6)命令模式
- Head First设计模式学习笔记-------(7)适配器模式
- Head First设计模式学习笔记-------(8)外观模式
- Head First设计模式学习笔记-------(10)迭代器模式
- Head First设计模式学习笔记-------(11)组合模式
- Head First设计模式学习笔记-------(13)代理模式
- Head First设计模式学习笔记-------(14)复合模式
- Head First 设计模式学习笔记
- (Head First 设计模式)学习笔记(1)
- 《Head First设计模式》学习笔记1
- 《Head First设计模式》学习笔记2
- c++头文件
- nginx配置改变默认访问路径
- 安装时 error: INSTALL_FAILED_VERSION_DOWNGRADE
- 正则表达式常用匹配
- 关于document.write()函数对文档流内容的清空问题
- Head First设计模式学习笔记-------(12)状态模式
- FastBoot BootLoader Recovery 模式解释
- 一个类成员函数的局部静态变量问题
- |算法讨论|线段树2 学习笔记
- 快速排序
- 简单工厂模式
- 前端基于流的自动化构建工具gulp入门
- jsp&server登录页面
- @Override is not allowed when implementing interface method