Behavioral模式State模式

1.意向

同意一个目标,然后改变其内部状态,改变它的行为。

对象似乎改变它的类别。

2.别名

状态对象(Objects for States)

3.动机

考虑一个表示网络连接的类TCPConnection。一个TCPConnection对象的状态处于若干不同状态之中的一个:连接已建立(Established)、正在监听(Listenling)。连接已关闭(Closed)。当一个TCPConnection对象收到其它对象的请求时。它依据自身的当前状态做出不同的反应。比如,一个Open请求的结果依赖于该连接是处于连接已关闭状态还是连接已建立状态。

State模式描写叙述了TCPConnection如何在每一种状态下表现出不同的行为。

4.适用性

下面情况使用State模式:

  • 一个对象的行为取决于它的状态,并且他必须在执行时刻依据状态改变它的行为。
  • 一个操作中含有庞大的多分支的条件语句。且这些分支依赖于该对象的状态。这个状态通经常使用一个或多个枚举常量表示。通常,有多个操作包括这一同样的条件结构。State模式将每个条件分支放入一个独立的类中。

    这使得你能够依据对象自身情况将对象的状态作为一个对象,这一对象能够不依赖于其它对象而独立变化。

5.结构

核心思想就是:当对象的状态改变时,同一时候改变其行为。非常好理解!就拿QQ来说。有几种状态。在线、隐身、忙碌等,每个状态相应不同的操作,并且你的好友也能看到你的状态,所以。状态模式就两点:1、能够通过改变状态来获得不同的行为。2、你的好友能同一时候看到你的变化。看图:

6.代码演示样例

State类是个状态类,Context类能够实现切换。我们来看看代码::

实现代码:

状态结构:

package com.xtfggef.dp.state;

/**
 * 状态类的核心类
 * 2012-12-1
 * @author erqing
 *
 */
public class State {

    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public void method1(){
        System.out.println("execute the first opt!");
    }

    public void method2(){
        System.out.println("execute the second opt!");
    }
}

实现:

package com.xtfggef.dp.state;

/**
 * 状态模式的切换类   2012-12-1
 * @author erqing
 *
 */
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 method() {
        if (state.getValue().equals("state1")) {
            state.method1();
        } else if (state.getValue().equals("state2")) {
            state.method2();
        }
    }
}
測试类:

public class Test {

public static void main(String[] args) {

    State state = new State();
    Context context = new Context(state);

    //设置第一种状态
    state.setValue("state1");
    context.method();

    //设置另外一种状态
    state.setValue("state2");
    context.method();
}

}

“`

输出:

execute the first opt!

execute the second opt!

依据这个特性,状态模式在日常开发中用的挺多的,尤其是做站点的时候,我们有时希望依据对象的某一属性,差别开他们的一些功能,比方说简单的权限控制等。

7.相关模式

  • Flyweight模式:解释了何时以及如何共享状态对象。
  • 状态对象一般是Singleton。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm

http://item.jd.com/10057319.html

http://blog.csdn.net/zhangerqing/article/details/8239539

时间: 2024-10-05 02:48:35

Behavioral模式State模式的相关文章

Java状态模式(State模式)

State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊

Behavioral模式之State模式

1.意图 允许一个对象再其内部状态改变时,改变它的行为.对象看起来似乎修改了它的类. 2.别名 状态对象(Objects for States) 3.动机 考虑一个表示网络连接的类TCPConnection.一个TCPConnection对象的状态处于若干不同状态之一:连接已建立(Established).正在监听(Listenling),连接已关闭(Closed).当一个TCPConnection对象收到其他对象的请求时,它根据自身的当前状态做出不同的反应.例如,一个Open请求的结果依赖于该

有限状态自动机FSM实现(二)--State模式

基于switch结构的有限状态自动机的实现已经在前一篇博文中给出,请猛击. State模式适用于如下情况: 1)一个对象的行为取决于它的状态,并且必须在运行时根据状态改变它的行为. 2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态. State模式包含如下对象: Context对象 1)定义客户感兴趣的接口. 2)维护一个State子类的实例,这个实例定义当前状态. State状态对象 定义一个接口封装与Context的一个特定状态相关的行为. 以下图为例:TCPConne

【行为型】State模式

状态模式其意图是在一个对象的状态发生变化时能够同时改变它的行为.一个生活中比较常见的例子就如你(是指你自己本人)在走时时,整个人全身的动作是双手臂前后慢慢摇摆且双脚也是一步一步慢慢往前移的,即:该走路状态下,你所对应的是走路动作:在跑步时,你的双手双脚动作明显频率.步伐都加快,即:在跑步状态下,你所对应的是跑步动作:........:在睡着时,你的全身都是不动的,即:睡着状态下,你是处于睡觉的动作状态.在实际项目开发中,(该模式)最常见的框架设计便是FSM了.模式的类关系结构图参考如下: 编码结

Java 实现状态(State)模式

/** * @author stone */ public class WindowState { private String stateValue; public WindowState(String stateValue) { this.stateValue = stateValue; } public String getStateValue() { return stateValue; } public void setStateValue(String stateValue) { t

State 模式

State模式中我们将状态逻辑和动作实现进行分离.允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类:在一个状态即将结束的时候启用下一个状态. 1 /////////state.h///////////////////////////////////////////////////////////////// 2 #pragma once 3 class Context ; 4 class State 5 { 6 public: 7 virtual ~State(); 8 S

State模式详解--设计模式(14)

State模式来源:         每个人.事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下转移到下一个不同的状态(State).最简单的一个生活中的例子就是:地铁入口处,如果你放入正确的地铁票,门就会打开让你通过.在出口处也是验票,如果正确你就可以ok,否则就不让你通过(如果你动作野蛮,或许会有报警(Alarm)). 有限状态自动机(FSM)也是一个典型的状态不同,对输入有不同的响应(状态转移).通常我们在实现这类系统会使用到很多的Switch/Case语句,Case某种

设计模式 - 状态模式(state pattern) 未使用状态模式 详解

状态模式(state pattern) 未使用状态模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式可以控制状态的转换, 未使用设计模式时, 程序会非常繁杂. 具体方法: 1. 状态转换类. /** * @time 2014年7月11日 */ package state; /** * @author C.L.Wang * */ public class GumballMachine { final static int SOLD_OUT =

敏捷软件开发 – STATE模式

地铁旋转门 最直接的实现FSM策略的方式是使用嵌套switch/case语句. public enum State { LOCKED, UNLOCKED }; public enum Event { COIN, PASS }; public class TurnStile { private State state = State.LOCKED; private TurnstileController turnstileController; public TurnStile(Turnstile