状态(State)模式是对象的行为模式,又称状态对象模式(Pattern of Object for States)。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。
状态模式结构与角色:
抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。
环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有环境。
在以下各种情况下可以使用状态模式:
1、 一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变。
2、 对象在某个方法里依赖于一重或多重的条件转移语句,其中有大量的代码。状态模式把条件转移语句的每一个分支都包装到一个单独的类里。这使得这些条件转移分支能够以类的方式独立存在和演化。维护这些独立的类也就不再影响到系统的其他部分。
状态模式的优点是使程序免于大量的条件转移语句,使程序实际上更易于维护。
状态模式的缺点是会造成大量的小的状态类。
状态模式的实现:
1、 谁来定义状态的变化。状态模式并没有规定哪一个角色决定状态发生转移的条件。如果转移条件是固定的,那么决定就应当由Context角色来做。然而,如果让State子类自行决定它的下一个继任者是谁,以及在什么时候进行转换,就更有灵活性。
2、 状态对象的创立和湮灭。其中值得权衡的做法有两种:
A) 动态地创立所需要的状态对象,不要创立不需要的状态对象。当不再需要某一状态对象时,便马上把此状态对象的实例湮灭掉。这种情况适合于实现不知道要使用哪一个状态对象,而一旦开始使用便不再频繁变更的情况。
B) 事先创立所有的对象,然后不再湮灭它们。适用于状态变化比较快和频繁、加载这些状态对象的成本较高的情况。
环境类可以把它自己作为参量传递给状态对象。