码迷,mamicode.com
首页 > 其他好文 > 详细

State 状态模式

时间:2016-10-21 00:31:25      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:


简介
状态模式允许一个对象在其内部【状态】改变的时候改变其【行为】。这个对象看上去就像是改变了它的类一样。
用一句话来表述,状态模式把所研究的对象的【行为】包装在不同的【状态对象】里,【每一个状态对象都属于【一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。
状态模式将一个条件分支】放入【一个独立的类】中。 这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

角色
  • 环境类Context:定义客户感兴趣的接口,维护一个ConcreteState子类的实例,这个实例定义当前状态
  • 抽象状态类State:定义一个接口以封装与Context的一个特定状态相关的【行为】
  • 具体状态类ConcreteState:每一子类实现【一个】与Context的【一个】状态相关的【行为】

适用性
  • 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
  • 2.一个操作中含有庞大的多分支的,且这些分支依赖于该对象的状态。 这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。

通过改变对象内部的状态,使得你可以在运行时动态改变一个对象的行为。
作用:将主对象和其状态分离,【状态对象】负责主对象的【状态转换】,使主对象类功能减轻
java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute()

演示
/** 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态 */
public class Context {
    //定义出所有的电梯状态
    public static OpenningState openningState;
    public static ClosingState closeingState;
    public static RunningState runningState;
    public static StoppingState stoppingState;
    //定一个当前电梯状态
    private IState state;
    public IState getState() {
        return state;
    }
    public Context() {
        openningState = new OpenningState(this);
        closeingState = new ClosingState(this);
        runningState = new RunningState(this);
        stoppingState = new StoppingState(this);
    }
    public void setState(IState state) {
        this.state = state;
        //把当前的环境通知到各个实现类中
    }
    public void open() {
        state.open();
    }
    public void close() {
        state.close();
    }
    public void run() {
        state.run();
    }
    public void stop() {
        state.stop();
    }
}

/**抽象状态类State,定义一个接口以封装与Context的一个特定状态相关的行为*/
public interface IState {
    /**电梯门开启动作*/
    public abstract void open();
    /**电梯关闭动作*/
    public abstract void close();
    /**电梯运行动作*/
    public abstract void run();
    /**电梯停止运行动作*/
    public abstract void stop();
}
//******************************************************************************************
/**具体状态类ConcreteState,每一子类实现【一个】与Context的【一个】状态相关的行为。本类定义在电梯门开启的状态下能做什么事情*/
class OpenningState implements IState {
    /**定义一个环境角色,也就是封装状态的变换引起的功能变化*/
    protected Context context;
    public OpenningState(Context context) {
        this.context = context;
    }
    @Override
    public void open() { //开门。Openning 状态是由 open()方法产生的,因此这个方法中肯定有一个具体的、独特的业务逻辑
        System.out.println("电梯门开启...");
    }
    @Override
    public void close() { //电梯门开启状态下关闭电梯门
        context.setState(Context.closeingState);//状态修改
        context.getState().close()//动作委托给CloseState来执行
    }
    @Override
    public void run() {
        System.out.println("------------------电梯门开启状态下运行?要死啊,你!");
    }
    @Override
    public void stop() {
        System.out.println("------------------电梯门开启状态下停止?额,这个本来就应该是这样的吧!");
    }
}
//******************************************************************************************
class ClosingState implements IState {
    protected Context context;
    public ClosingState(Context context) {
        this.context = context;
    }
    @Override
    public void close() {//电梯门关闭
        System.out.println("电梯门关闭...");
    }
    @Override
    public void open() {//电梯门关闭状态下打开
        context.setState(Context.openningState);
        context.getState().open();
    }
    @Override
    public void run() {//电梯门关闭状态下运行
        context.setState(Context.runningState);
        context.getState().run();
    }
    @Override
    public void stop() {//电梯门关闭状态下停止
        context.setState(Context.stoppingState);
        context.getState().stop();
    }
}
//******************************************************************************************
class RunningState implements IState {
    protected Context context;
    public RunningState(Context context) {
        this.context = context;
    }
    @Override
    public void close() {
        System.out.println("------------------运行状态下关闭电梯门?电梯门本来就是关着的!");
    }
    @Override
    public void open() {
        System.out.println("------------------运行状态下开电梯门?你疯了!");
    }
    @Override
    public void run() { //运行
        System.out.println("电梯上下跑...");
    }
    @Override
    public void stop() {//运行状态下停止
        context.setState(Context.stoppingState);
        context.getState().stop();
    }
}
//******************************************************************************************
class StoppingState implements IState {
    protected Context context;
    public StoppingState(Context context) {
        this.context = context;
    }
    @Override
    public void close() {
        System.out.println("------------------停止状态下关门?电梯门本来就是关着的!");
    }
    @Override
    public void open() {//停止状态下开门
        context.setState(Context.openningState);
        context.getState().open();
    }
    @Override
    public void run() {//停止状态下运行
        context.setState(Context.runningState);
        context.getState().run();
    }
    @Override
    public void stop() {//停止
        System.out.println("电梯停止了...");
    }
}

public class Test {
    public static void main(String[] args) {
        Context context = new Context();
        test(context, new OpenningState(context));
        test(context, new ClosingState(context));
        test(context, new RunningState(context));
        test(context, new StoppingState(context));
    }
    public static void test(Context context, IState state) {
        System.out.println("【" + state.getClass().getSimpleName() + "】");
        for (int i = 0; i < 4; i++) {
            context.setState(state);
            switch (i) {
            case 0:
                context.open();
                break;
            case 1:
                context.close();
                break;
            case 2:
                context.run();
                break;
            case 3:
                context.stop();
                break;
            }
        }
        System.out.println();
    }
}





附件列表

     

    State 状态模式

    标签:

    原文地址:http://www.cnblogs.com/baiqiantao/p/87f5f361ba8bf4db708e3caf517c1c19.html

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!