Head First 设计方式-State
Head First 设计模式--StateChapter 10 --状态模式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?事务的状态??1. 把
Head First 设计模式--State
Chapter 10 --状态模式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?事务的状态
?
?
1. 把一个状态的所有行为放在一个类中。这样将行为局部化,并使得事情更容易改变和理解。
?
2. 在状态类中要做的事情是实现适合所在的状态的行为。在某些情况下,这个行为会转变到其他状态。
?
?
状态模式:
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
?
Structure
Context: Context(上下文)是一个类,它可以拥有一些内部状态。不管是在什么时候,只要有人调用Context的request()方法,它就会被委托到状态来处理。State: State接口定义了一个所有具体状态的共同接口;任何状态都实现这个相同的接口,这样,状态之间可以互相替换。ConcreteState: 具体状态处理来自Context的请求。每一个ConcreteState都提供了它自己对于请求的实现。所以,当Context改变状态时行为也跟着改变。可以有许多具体的状态。
?
3. 该模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,这样行为就会随着内部状态而改变。该模式使用组合通过简单引用不同的状态对象来造成类改变的假象。
状态模式和策略模式的区别(1) 对于状态模式,我们将一群行为封装在状态对象中,context的行为随时可委托到那些状态对象中的一个。随着时间的流逝,当前状态在状态对象集合中游走改变,以反映出context内部的状态,因此context的行为也会跟着改变。但是context的客户对于状态了解不多。(2) 对于策略模式,客户通常主动指定context所要组合的策略对象是哪一个。对于某个context对象来说,通常都只有一个最适当的策略对象。(3) 策略模式是除了继承之外的一种弹性的替代方案,你可以通过组合不同的对象改变行为。而状态模式为了不用在context中放置许多条件判断的替代方案。通过将行为包装进状态对象中,你可以通过在context内简单地改变状态对象来改变context的行为。
本章小结:状态模式允许一个对象基于内部状态而拥有不同的行为。和程序状态机(PSM)不同,状态模式用类代表状态。Context会将行为委托给当前状态对象。通过将每个状态封装进一个类,我们把以后需要做的任何改变局部化了。状态模式和策略模式有相同的类图,但是它们的意图不同。策略模式通常会用行为或算法来配置Context类。状态模式允许Context随着状态的改变而改变行为。状态转换可以由State类或Context类控制。使用状态模式通常会导致设计中的类的数目大量增加。状态类可以被多个Context实例共享。
?