状态模式-State

名称:

    状态模式(State Pattern)-对象行为模式

 

问题:

    The State pattern allows an object to alter its behavior when its internal state changes. The object appears to change its class.   

     允许一个对象在其内部状态改变时改变她的行为。对象看起来似乎修改了它的类。

 

适用性:

    -一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

    -一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其它对象而独立变化。

 

协作:

    -Context将于状态相关的请求委托给当前的ConcreteState对象处理。

    -Context可将自身作为一个参数传递给处理该请求的状态对象。这使得状态对象在必要时可访问Context。

    -Context是客户使用的主要接口。客户可用状态对象来配置一个Context,一旦一个Context配置完毕,它的客户不再需要直接与状态对象打交道。

    -Context或ConcreteState子类都可决定哪个状态是另外哪一个的后继者,以及是在何种条件下进行状态转换。

 

优点和缺点:

    1、它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

    2、它使得状态转换显式化。

    3、State对象可被共享。

 

解决方案:

    

1、 模式的参与者

    1、Context

    -定义客户感兴趣的接口。

    2、State

    -定义一个接口以封装与Context的一个特定状态相关的行为。

    3、ConcreteState subclasses

    -每一个子类实现一个与Context的一个状态相关的行为。

 

2.实现方式

class Context
{
    private State state;
   
    public Context()
    {
        this.state=new ConcreteStateA();
    }
   
    public void setState(State state)
    {
        this.state=state;
    }

    public State getState()
    {
        return state;
    }
   
    public void Handle()
    {
        state.Handle(this);
    }
}
abstract class State
{
    public abstract void Handle(Context context);
}
class ConcreteStateA extends State
{
    public void Handle(Context context)
    {
        context.setState(new ConcreteStateB());
    }
}
class ConcreteStateB extends State
{
    public void Handle(Context context)
    {
        context.setState(new ConcreteStateA());
    }
}

 

参考资料

《设计模式:可复用面向对象软件的基础》

 

posted @ 2020-06-29 21:43  diameter  阅读(116)  评论(0编辑  收藏  举报