状态模式

概述:

        状态模式允许一个对象在其内部状态改变的时候改变其行为,

        在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。
            适用性
在下面的两种情况下均可使用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
        
    }
}
View Code

状态模式的优点:
1 ) 它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来:

2) 它使得状态转换显式化: 当一个对象仅以内部数据值来定义当前状态时 , 其状态仅表现为对一些变量的赋值,这不够明确。

3) State对象可被共享 如果State对象没有实例变量—即它们表示的状态完全以它们的类型来编码—那么各Context对象可以共享一个State对象。当状态以这种方式被共享时, 它们必然是没有内部状态, 只有行为的轻量级对象。

状态模式的缺点:
1) 状态模式的使用必然会增加系统类和对象的个数。
2) 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。

 

原文地址:https://www.cnblogs.com/whesuanfa/p/7494305.html