4.状态模式

1.知识点

学习案例:http://www.cnblogs.com/ludashi/p/5443563.html

  • 状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类

  • 解析:这个模式将状态封装成独立的类,并将动作委托到代表当前状态的对象。例如,ATM机案例中,ATM类并没有直接处理“存取操作”,而是通过不同的“状态类”去处理,即委托“状态类”处理具体事件。

2.状态模式与策略模式

  • 1.策略模式
    允许对象能够通过组合和委托来拥有不同的行为或算法。通常,我们把策略模式想成是除了继承之外的一种弹性代替方式。如果你使用继承定义了一个类的行为,你将被这个行为困住,甚至修改它会非常困难。而策略模式可以通过组合不同的对象来改变行为。
    例如,你有一个可以实例化的鸭子类,需要实现呱呱叫行为。
    1)使用继承:每个鸭子类都需要实现一个呱呱叫的行为。如果有多个鸭子的行为是相同的,我们可以把相同的行为放在基类中,调用自身的行为时,先调用一下父类中的通用行为。如果某一类的行为发生了变化,我们需要把所有鸭子类中的行为都更改,这个工作量是非常巨大的。
    2)使用策略模式,实现好一系列的呱呱叫行为,每个鸭子实例类根据需求调用具体的行为类。当有新的鸭子出现时,我们只要改变现有行为或添加新行为就好了。这也体现了针对接口编程,而不是针对实现编程。

  • 2.状态模式
    将一群行为封装在不同的状态对象类中,类的行为随时可委托到那些状态对象类的任一个。将具体行为封装成接口类,把具体行为委托给接口类实现,这一点和策略模式是相似的。但是,状态模式通过状态决定了行为类的调用,状态切换可以调用不同的行为,这些都是事先编码决定好的。策略模式虽然也可以通过运行时决定策略的选择,但那不是根据状态对象决定的。

3.问答

  • 1.状态总是决定接下来的状态是什么吗?
    并非如此。状态类可以决定接下来的状态,但是这会让状态类之间产生依赖。当状态的转换是固定的时候,适合这么做。我们也可以让类本身去决定状态的转换。

  • 2.用户能否直接和状态交互?
    不能,状态是用在类中来代表它的内部状态以及行为的,只有类才会对状态提出请求。

  • 3.如果类有多个实例,这些实例之间的状态可以共享吗?
    可以。但是唯一的前提是,你的状态对象不能持有它们自己的内部状态

你可能感兴趣的:(4.状态模式)