状态模式深入思考
来源:互联网 发布:python编程入门 epub 编辑:程序博客网 时间:2024/05/09 09:05
状态模式的状态中的方法是促进状态转化的操作,当然也可以包括一些公共的行为,必须几个状态都有disply的方法,那这个方法可以放到抽象状态中。而不是说一种状态对应一个方法,这样理解是不对的。
我的一点思考:感觉,tcpconnection这个适合状态模式、上传下载的状态等等这些都较为适合使用这个模式。
以下是《head first设计模式》上的一个案例:从这个案例中可以看出,insertQuarter、ejectQuarter、turnCrank、dispense这几个方法可以促进状态之间的转化,这些方法对应着接口中的方法。不过每个具体的状态都可以有自己的个性(private方法)。
!!!
状态模式的难点就在于如何设计抽象接口中的几个方法。这才是他的难点所在。
/** * Created by annuoaichengzhang on 16/4/21. * 糖果机的案例 */public interface State { public void insertQuarter(); // 投入25分钱 public void ejectQuarter(); // 拒绝25分钱 public void turnCrank(); // 转动曲柄 public void dispense(); // 发放糖果}
/** * Created by annuoaichengzhang on 16/4/21. *//* * 有25分钱状态,实现了State接口 */public class HasQuarterState implements State { Random randomWinner = new Random(System.currentTimeMillis()); //首先我们增加一个随机数产生器,产生10%赢的机 GumballMachine gumballMachine; public HasQuarterState(GumballMachine gumballMachine){ this.gumballMachine = gumballMachine; } // 投入25分钱 public void insertQuarter() { System.out.println("You can not insert anther quarter"); } // 拒绝25分钱 public void ejectQuarter() { System.out.println("Quarter returned"); gumballMachine.setState(gumballMachine.getNoQuarterState()); } // 转动曲柄 public void turnCrank() { System.out.println("You turned..."); int winner = randomWinner.nextInt(10); System.out.println("winner =" + winner); if((winner ==0) && (gumballMachine.getCount() > 1)) { gumballMachine.setState(gumballMachine.getWinnerState()); } else { gumballMachine.setState(gumballMachine.getSoldState()); } } // 发放糖果 public void dispense() { System.out.println("No gumball dispensed"); }}
/** * Created by annuoaichengzhang on 16/4/21. *//* * 没有25分钱状态,实现了State接口 */public class NoQuarterState implements State{ GumballMachine gumballMachine; public NoQuarterState(GumballMachine gumballMachine){ this.gumballMachine=gumballMachine; } // 投入25分钱 public void insertQuarter() { System.out.println("You insert a quarter"); gumballMachine.setState(gumballMachine.getHasQuarterState()); } // 拒绝25分钱 public void ejectQuarter() { System.out.println("You haven't insert a quarter"); } // 转动曲柄 public void turnCrank() { System.out.println("You turned crank,but you there's no quarter"); } // 发放糖果 public void dispense() { System.out.println("You need to pay first"); }}
/** * Created by annuoaichengzhang on 16/4/21. *//* * 通过售罄状态,实现了State接口 */public class SoldOutState implements State{ GumballMachine gumballMachine; public SoldOutState(GumballMachine gumballMachine){ this.gumballMachine=gumballMachine; } // 投入25分钱 public void insertQuarter() { System.out.println("You can't insert a quarter, the machine is sold out"); } // 拒绝25分钱 public void ejectQuarter() { // TODO Auto-generated method stub System.out.println("You can't eject, you haven't inserted a quarter yet"); } // 转动曲柄 public void turnCrank() { // TODO Auto-generated method stub System.out.println("You turned, but there are no gumballs"); } // 发放糖果 public void dispense() { // TODO Auto-generated method stub System.out.println("No gumball dispensed"); }}
/** * Created by annuoaichengzhang on 16/4/21. *//* * 售出糖果状态,实现了State接口 */public class SoldState implements State{ GumballMachine gumballMachine; public SoldState(GumballMachine gumballMachine) { this.gumballMachine = gumballMachine; } // 投入25分钱 public void insertQuarter() { System.out.println("Please wait, we're already giving you a gumball"); } // 拒绝25分钱 public void ejectQuarter() { System.out.println("Sorry,you have already turn crank"); } // 转动曲柄 public void turnCrank() { System.out.println("trun twice ,doesn't give you anthor gamball!"); } // 发放糖果 public void dispense() { gumballMachine.releaseBall(); if(gumballMachine.getCount()>0){ gumballMachine.setState(gumballMachine.getNoQuarterState()); } else { System.out.println("Opps,out of gamball!"); gumballMachine.setState(gumballMachine.getSoldOutState()); } }}
/** * Created by annuoaichengzhang on 16/4/21. *//* * 赢家状态,实现了State接口 */public class WinnerState implements State{ GumballMachine gumballMachine; public WinnerState(GumballMachine gumballMachine){ this.gumballMachine = gumballMachine; } // 投入25分钱 @Override public void insertQuarter() { // TODO Auto-generated method stub System.out.println("Please wait, we're already giving you a gumball"); } // 拒绝25分钱 @Override public void ejectQuarter() { // TODO Auto-generated method stub System.out.println("Sorry,you have already turn crank"); } // 转动曲柄 @Override public void turnCrank() { // TODO Auto-generated method stub System.out.println("trun twice ,doesn't give you anthor gamball!"); } // 发放糖果 @Override public void dispense() { // TODO Auto-generated method stub 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("Opps,out of gamball!"); gumballMachine.setState(gumballMachine.getSoldOutState()); } } }}
/** * Created by annuoaichengzhang on 16/4/21. *//* * 糖果机器上下文环境接口类 GumballMachine */public class GumballMachine { //状态实例 State soldOutState; State noQuarterState; State hasQuarterState; State soldState; State winnerState; // 实例变量state,初始化为糖果售罄状态 State state = soldOutState; // 记录机器内装有糖果的数目,开始机器是没有装糖果的 int count=0; // 构造器取得糖果的初始数目并把它放在一个实例变量count中 public GumballMachine(int numberGumballs) { // 每种状态都创建一个状态实例 soldOutState=new SoldOutState(this); noQuarterState=new NoQuarterState(this); hasQuarterState=new HasQuarterState(this); soldState=new SoldState(this); winnerState = new WinnerState(this); this.count = numberGumballs; // 若超过0颗糖果,就将状态设置为NoQuarterState if(numberGumballs > 0) { state = noQuarterState; } } // 取得机器内的糖果数目 public int getCount() { return count; } // 取得糖果售罄状态 public State getSoldOutState() { return soldOutState; } // 取得没有25分钱状态 public State getNoQuarterState() { return noQuarterState; } // 取得拥有25分钱 public State getHasQuarterState() { return hasQuarterState; } // 取得售出糖果状态 public State getSoldState() { return soldState; } // 取得赢家状态 public State getWinnerState() { return winnerState; } // 投入25分钱 public void insertQuarter(){ state.insertQuarter(); } // 拒绝25分钱 public void ejectQuarter(){ state.ejectQuarter(); } // 转动曲柄 public void turnCrank(){ state.turnCrank(); state.dispense(); } // 设置状态 public void setState(State state){ this.state=state; } // 糖果滚出来一个 public void releaseBall(){ System.out.println("A gumball comes rolling out of the solt..."); if(count!=0){ count--; } }}
/** * Created by annuoaichengzhang on 16/4/21. *//* * 糖果机测试驱动程序:GumballMachineTestDrive.java */public class GumballMachineTestDrive { /** * @param args */ public static void main(String[] args) { GumballMachine gumballMachine = new GumballMachine(5); System.out.println(gumballMachine); System.out.println("The current gumball number is:" + gumballMachine.getCount()); System.out.println("****************************************"); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); System.out.println(gumballMachine); System.out.println("The current gumball number is:" + gumballMachine.getCount()); System.out.println("****************************************"); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); System.out.println(gumballMachine); System.out.println("The current gumball number is:" + gumballMachine.getCount()); System.out.println("****************************************"); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); System.out.println(gumballMachine); System.out.println("The current gumball number is:" + gumballMachine.getCount()); System.out.println("****************************************"); }}
0 0
- 状态模式深入思考
- 状态模式学习和思考
- 设计模式深入学习--State 状态模式(行为型模式)
- 深入思考
- 深入讨论设计模式中的State状态模式
- 设计模式与泡mm的关系之state状态模式及再思考
- 状态的哲学思考
- 交流引发深入思考
- 索引index深入思考
- 深入思考换工作
- 深入理解JavaScript系列(43):设计模式之状态模式
- 深入理解JavaScript系列(43):设计模式之状态模式
- 深入理解JavaScript系列(43):设计模式之状态模式
- 读书笔记_java设计模式深入研究 第八章 状态模式 State
- 深入理解JavaScript系列(43):设计模式之状态模式
- 深入理解JavaScript系列(43):设计模式之状态模式
- 深入理解JavaScript系列(43):设计模式之状态模式
- 深入理解JavaScript系列(43):设计模式之状态模式
- Android多线程-HandlerThread用法与源码解析
- Unity模拟QQ截图以及全屏截图
- 【経験談】VS2013控制台程序运行窗口闪退问题
- Oracle-SQL02
- java 账号注册(length(),equals())
- 状态模式深入思考
- 非常好的理解遗传算法的例子
- 对于嵌入式的一些认识
- Android资源文件分类
- ZOJ 3204 Connect them 【最小生成树+输出选取的边】
- android 开发从入门到精通
- CentOS7 时区设置.md
- c++修改文件名后缀 文件路径分解与批处理文件遍历
- 训练2 11题