大话设计模式—状态模式

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

大话设计模式中程杰老师给出的定义是,状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。当然,如果这个状态判断很简单就没有必要使用“状态模式”了。

状态模式结构图如下:

结构图解析:

1、State,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为;

2、ConcreteState类,具体状态类,每一个子类实现一个与Context的一个状态相关的行为;

3、Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态;

下面给出一个运动员开始和结束运动的实例还具体看一下状态模式的运用,类图如下:

package com.exercise.state;
/**
 * 抽象状态接口
 * @author lmb
 *
 */
public interface State {

    public void doAction(Context context);

}
package com.exercise.state;
/**
 * 状态对象StartState
 * @author lmb
 *
 */
public class StartState implements State {

    @Override
    public void doAction(Context context) {
        System.out.println("Player is in start state.");
        context.setState(this);
    }

    public String toString(){
        return "start state";
    }

}
package com.exercise.state;
/**
 * 状态对象StopState
 * @author lmb
 *
 */
public class StopState implements State {

    @Override
    public void doAction(Context context) {
        System.out.println("Player is in stop state.");
        context.setState(this);
    }

    public String toString(){
        return "stop state";
    }

}
package com.exercise.state;
/**
 * 行为随着状态对象改变而改变的Context类
 * @author lmb
 *
 */
public class Context {

    public State state;

    public Context(){
        state = null;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

}
package com.exercise.state;

public class TestState {

    public static void main(String[] args) {

        Context context = new Context();

        StartState startState = new StartState();
        startState.doAction(context);//将状态设定为开始状态
        System.out.println(context.getState().toString());

        StopState stopState = new StopState();
        stopState.doAction(context);//将状态设定为结束状态
        System.out.println(context.getState().toString());

    }

}

运行结果:

Player is in start state.
start state
Player is in stop state.
stop state

状态模式的好处:

将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。简而言之就是,将特定状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个State实现类中,所以通过定义新的子类可以很容易的增加新的状态和转换。这样做的目的就是为了消除庞大的分支语句,大的分支判断通过会使得它们难以修改和扩展。状态模式通过把各种状态转移逻辑分不到State子类之间,来减少相互间的依赖,这样就容易维护和扩展了。

使用场景:

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。

缺点:

1、状态模式的使用必然会增加系统类和对象的个数。

2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。

3、状态模式对”开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

注意事项:在行为受状态约束的时候使用状态模式,而且状态不超过 5 个。

时间: 2024-11-03 21:52:41

大话设计模式—状态模式的相关文章

大话设计模式---状态模式

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化. 好处:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了.

设计模式 状态模式 以自动售货机为例

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/26350617 状态模式给了我眼前一亮的感觉啊,值得学习~ 先看定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.定义又开始模糊了,理一下,当对象的内部状态改变时,它的行为跟随状态的改变而改变了,看起来好像重新初始化了一个类似的. 下面使用个例子来说明状态模式的用法,现在有个自动售货机的代码需要我们来写,状态图如下: 分析一个这个状态图: a.包含4个状态(

5.大话设计模式-代理模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DesignModel { public class Proxy:IAction { ZQZ zzz = null; public Proxy(ZQZ mm) { zzz = mm; } public void SendFlower() { zzz

2.大话设计模式-策略模式

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <summary> 10 /// 策略模式 11 /// </summary> 12 public class TacticsModel 13 { 14 //对于

6.大话设计模式-工厂模式

工厂模式和简单工厂有什么区别.废话不多说,对比第一篇例子应该很清楚能看出来. 优点: 工厂模式弥补了简单工厂模式中违背开放-封闭原则,又保持了封装对象创建过程的优点. using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace DesignModel{    public interface Factory   

设计模式 - 状态模式(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 pattern) 详解

状态模式(state pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式(state pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 建立Context类, 包含多个具体状态(concrete state)类的组合, 根据状态的不同调用具体的方法, state.handle(), 包含set\get方法改变状态. 状态接口(state interface), 包含抽象方法handle(),

14. 星际争霸之php设计模式--状态模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248198.html============================================

【C#设计模式-状态模式】

一.状态模式的定义:状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. 二.状态模式的意图:允许一个对象在其内部状态改变时改变它的行为. 三.状态模式的适用场景: 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态. 四.状态模式的实现: /// <summary> /// 定义接口,封装Context对象在特定