13. 状态模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/llz62378/article/details/78169252
        状态模式:改变对象内部状态,帮助对象控制自己的行为。
        书中的例子是糖果机售卖糖果的例子,糖果机共有4种状态,没有投入硬币,已经投入硬币,售卖糖果,已售完。糖果机的动作也有4种,投入硬币,退回硬币、搬动曲柄、发放糖果。通常的做法,对于不同的动作内部会做判断当前的状态,根据状态做不同的实现。这样的做法不利于扩张,当需要加入新的状态时,需要对各个动作进行改动,不利于代码的维护。



新的设计:
1.定义state接口类
2.各个状态类,继承于state接口类。各个状态负责各种动作的实现。
3.将动作转换委托给状态类。

client:
Machine machine;
State stateA;
machine.SetState(stateA);
machine.Handle1();
machine.Handle2();
        添加winnerState,在投入硬币后,搬动曲柄的时候,产生一个随机数,来决定是否赢得多一个糖果。 


要点:
1.状态转换流向可以由context控制,也可以由状态来控制。
2.如果context实例化多个对象,那么他们是可以共享状态的。每个状态声明为static.
3.客户不需要对状态进行操作。
4.扩展时,可以增加具体状态类,并对context的方法进行扩展。
5.当状态很多时,会导致类的数目增多。

策略模式与状态模式的异同:
相同点:行为的发出者和行为的实现者 都可以在运行时改变行为(算法/状态)。他们的设计模式基本相同。
不同点:他们解决的问题不同,策略模式用来控制对象采用什么样的策略,而状态模式是用来帮助状态改变自己的行为。

猜你喜欢

转载自blog.csdn.net/llz62378/article/details/78169252