State 状态模式

简介

状态模式允许一个对象在其内部【状态】改变的时候改变其【行为】。这个对象看上去就像是改变了它的类一样。

用一句话来表述,状态模式把所研究的对象的【行为】包装在不同的【状态对象】里,【每一个状态对象】都属于【一个抽象状态类的一个子类】。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。

状态模式将每【一个条件分支】放入【一个独立的类】中。 这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

角色
  • 环境类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();     } }

来自为知笔记(Wiz)

附件列表

时间: 2024-10-06 08:58:44

State 状态模式的相关文章

State状态模式(C++实现)

状态模式:状态模式的意图是,允许一个对象在其内部状态改变时,改变它的行为.看起来就像是改变了它的类一样. 主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化. 类图如下图所示 State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为.ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为.Context类,维护一个ConcreteState子类

设计模式21:State 状态模式(行为型模式)

State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. 如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转换之间引入紧耦合? 意图(Intent) 允许一个对象在其内部状态改变时改变它的行为.从而使对象看起来似乎修改了其行为.——<设计模式>GoF 结构(Structure) 示例代码 public enum Document

设计模式 ( 十八 ):State状态模式 -- 行为型

1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得“力不从心了”.随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,

详解state状态模式及在C++设计模式编程中的使用实例

原文地址:http://www.jb51.net/article/80713.htm 这篇文章主要介绍了state状态模式及在C++设计模式编程中的使用实例,在设计模式中策略用来处理算法变化,而状态则是透明地处理状态变化,需要的朋友可以参考下 每个人.事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下转移到下一个不同的状态(State).最简单的一个生活中的例子就是:地铁入口处,如果你放入正确的地铁票,门就会打开让你通过.在出口处也是验票,如果正确你就可以 ok,否则就不让你通

设计模式---状态变化模式之state状态模式(State)

前提:状态变化模式 在组建构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一个问题提供了一种解决方案. 典型模式 状态模式:State 备忘录模式:Memento 一:State状态模式 (一)概念 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (二)动机 在软

设计模式(20)--State(状态模式)--行为型

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 2.模式特点: 状态模式的主要优点在于封装了转换规则,并枚举可能的状态,它将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,还可以

程序设计模式 —— State 状态模式

我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是状态模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一定必须学会C++,这些代码都有非常丰富的注释和简单的语法. 3.请不要跳着看,除非你已经学会. 那么现在开始吧 或许你会以为是类的各种状态,其实差不多.但是还有各种行为 允许一个对象在其内部状态改变时改变它的行为.实例化的对象看起来似乎修改了它的类 首先,状态,顾名思义你应该就差不多明白.它可以表示

[C++设计模式] state 状态模式

<head first 设计模式>中的例子很不错,想制造一个自动交易的糖果机,糖果机有四个状态:投入钱不足,投入钱足够,出售糖果,糖果售罄.糖果机的当前状态处于其中不同的状态时,它针对同一个操作的反映动作也不同.传统面向过程编程会套用if-else对不同的状态下分别处理,逻辑麻烦而且不具有可拓展性. 状态模式:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对于一个对象的状态,我们都是让这个对象包含一个状态的属性,这个状态属性记录着

JAVA设计模式十二--State(状态模式)

状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化.意图:允许一个对象在其内部状态改变时改变它的行为适用场景: 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2.一个操作中含有庞大的多分支结