Fork me on GitHub

java设计模式之状态模式

状态模式

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

状态模式UML图

  上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。

  抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。

  具体状态(Concrete State):实现抽象状态定义的接口。

状态模式代码

package com.roc.state;

public class Context {

    private State state;
    
    public Context(State state){
        this.state=state;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
    
    public void stateChange(){
        state.action(this);
    }
    
}
package com.roc.state;
/**
 * 抽象状态类
 * @author liaowp
 *
 */
public abstract class State {
    public abstract void action(Context context);
}
package com.roc.state;

public class OpenSate extends State{

    public void action(Context context) {
        System.out.println("开");
        context.setState(new CloseState());
    }

}
package com.roc.state;

public class CloseState extends State{

    public void action(Context context) {
        System.out.println("关");
        context.setState(new OpenSate());
    }

}
package com.roc.state;
/**
 * 状态模式
 * @author liaowp
 *
 */
public class Client {
    public static void main(String[] args) {
        Context context=new Context(new CloseState());
        context.stateChange();
        context.stateChange();
        context.stateChange();
        context.stateChange();
        context.stateChange();
        context.stateChange();
        context.stateChange();
        context.stateChange();
    }
}

状态模式适用场景

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

   所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。

   状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

posted @ 2016-08-20 19:10  鹏&鹏  阅读(3455)  评论(0编辑  收藏  举报