设计模式十之状态模式1

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

  这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,我们知道行为会随着内部状态而改变。糖果机提供了一个很好地例子:当糖果机是在NoQuarterState或HasQuarterState两种不同的状态时,你投入25分钱,就会得到不同的行为(机器接受25分钱和机器拒绝25分钱)。

  如果说你使用的对象能够完全改变它的行为,那么会觉得,这个对象实际上是从别的类实例化而来的。然而,实际上,我们是在使用组合通过简单引用不同的状态对象来造成类改变的假象。

  类比策越模式。以状态模式而言,我们将一群行为封装在状态对象中,context的行为随时可委托到那些状态对象中得一个。随着实际的流逝,当前状态在状态对象集合中游走改变,以反映出context内部的状态,因此,context的行为也会跟着改变。但是context的客户对于状态对象了解不多,甚至根本是浑然不觉。

  而以策略模式而言,客户通常主动指定Context所要组合的策略对象是哪一个。现在,固然策略模式让我们具有弹性,能够在运行时改变策略,但对于某个context对象来说,通常都只有一个最适当的策略对象。比方说,在第一章,有些鸭子(例如绿头鸭)被设置成利用电信的飞翔行为进行飞翔,而有些鸭子使用飞翔行为只能让它们紧贴地面。

  一般来说,我们把策略模式想成是除了继承之外的一种弹性替代方案。如果你使用继承定义了一个类的行为,你将被这个行为困住,甚至要修改它都很难。有了策略模式,你可以通过组合不同的对象来改变行为。

  我们把状态模式想成是不用在context中放置许多条件判断的替代方案。通过将行为包装进状态对象中,你可以通过在context内简单地改变状态对象来改变context的行为。

posted @ 2016-01-01 20:37  likeshu  阅读(166)  评论(0编辑  收藏  举报