设计模式之状态模式

来源:互联网 发布:java特种兵入门java 编辑:程序博客网 时间:2024/06/15 08:39

设计模式之——状态模式

  • 状态模式定义
    状态模式允许对象在内部状态发生改变的时候改变它的行为,对象看起来好像修改了它的类。这个模式将状态封装成独立的类,并将动作委托到代表当前状态的对象,这样行为会随着内部的状态而改变。
    Content{
    State state1;
    State state2;
    State currState;
    request1(){
    currState.handle1();
    }
    request2(){
    currState.handle2();
    }
    }
    State{
    handle1();
    handle2();
    }
    ConcreteState1 extends State{
    Context context;
    handle1(){
    …..
    context.setCurrState(context.getState2());
    }
    handle2(){….}
    }
    ConcreteState2 extends State{
    Context context;
    handle1(){
    …..
    context.setCurrState(context.getState1());
    }
    handle2(){….}
    }
    Context(上下文)是一个类,他可以拥有一些内部状态,其中的方法request1和request2,只要有人调用则会被委托给currState对象中处理, State接口定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样一来,状态之间可以相互替换,ConcreteState是具体的状态类,处理来自Context的请求,每个ConcreteState都提供了他自己对于请求的实现,所以当Context改变状态时,行为也会跟着改变。

  • 与策略模式的区别
    以状态模式而言,我们将一群行为封装到状态对象中,context的行为随时可以委托到那些状态对象中的一个,随着时间的流逝,当前状态在状态对象集合中游走改变,反映出context内部的状态,因此context的行为也会跟着改变,但是context的客户对于状态对象的存在浑然不知。
    而以策略模式而言,客户通常主动指定Context所要组合的策略对象,现在,固然策略模式让我们具有弹性,能够在运行时改变策略,但是对于某个context来说通常只有一个最合适的策略对象。
    一般来说,我们将策略模式想象成除了继承之外的一种弹性替代方案,如果你使用继承定义了一个类的行为,你将被这个行为困住,设置要修改它都很难,有了策略模式你可以通过组合不同的对象来改变行为,我们把状态模式想成是不用在context中放置很多条件判断的替代方案,通过将行为包装进状态对象中,我们可以通过在context内简单的改变状态对象来改变context的行为。