状态模式
概述:
状态模式允许一个对象在其内部状态改变的时候改变其行为,
在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。
适用性
View Code
在下面的两种情况下均可使用State模式:
if else(或switch case)语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。模式的组成环境类(Context): 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。
抽象状态类(State): 定义一个接口以封装与Context的一个特定状态相关的行为。
具体状态类(ConcreteState): 每一子类实现一个与Context的一个状态相关的行为
状态模式应用的例子:TCPconnection
class TcpConnection { private TcpState state; public void setState(TcpState state) { this.state = state; } void open(){ state.open(); } void close(){ state.close(); } void acknowledge(){ state.acknowledge(); } } interface TcpState { void open(); void close(); void acknowledge(); } class TcpEstablished implements TcpState { @Override public void open() { // TODO Auto-generated method stub } @Override public void close() { // TODO Auto-generated method stub } @Override public void acknowledge() { // TODO Auto-generated method stub } }
状态模式的优点:
1 ) 它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来:
2) 它使得状态转换显式化: 当一个对象仅以内部数据值来定义当前状态时 , 其状态仅表现为对一些变量的赋值,这不够明确。
3) State对象可被共享 如果State对象没有实例变量—即它们表示的状态完全以它们的类型来编码—那么各Context对象可以共享一个State对象。当状态以这种方式被共享时, 它们必然是没有内部状态, 只有行为的轻量级对象。
状态模式的缺点:
1) 状态模式的使用必然会增加系统类和对象的个数。
2) 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。