行为型模式之 状态模式

状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。

主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

何时使用:代码中包含大量与对象状态有关的条件语句。

如何解决:将各种具体的状态类抽象出来。

关键代码:通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if...else 等条件选择语句。

优点: 1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

缺点: 1、状态模式的使用必然会增加系统类和对象的个数。 2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。 3、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

使用场景: 1、行为随状态改变而改变的场景。 2、条件、分支语句的代替者。

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

实现

我们将创建一个 State 接口和实现了 State 接口的实体状态类。Context 是一个带有某个状态的类。

//步骤1 创建一个接口
class State {
public:
    void virtual doAction(Context* context) {}
    virtual string ToString() { return ""; }
};

//步骤二 创建context类
class Context {
private:
    State* state;

public:
    Context() {
        state = NULL;
    }

    void SetState(State* stat) {
        state = stat;
    }

    State* GetState() {
        return state;
    }
};

//步骤二 创建接口实体类
class startState :public State {
public:
    void doAction(Context* context)
    {
        cout << "start state" << endl;
        context->SetState(this);
    }
    string ToString() { return "Start state"; }
};

class stopState :public State {
public:
    void doAction(Context* context)
    {
        cout << "stop state" << endl;
        context->SetState(this);
    }
    string ToString() { return "Stop state"; }
};

int main() {
    Context cont;
    startState startstat;
    startstat.doAction(&cont);
    cout << cont.GetState()->ToString() << endl;

    stopState stopstat;
    stopstat.doAction(&cont);
    cout << cont.GetState()->ToString() << endl;

    return 0;
}

原文地址:https://www.cnblogs.com/gardenofhu/p/8508743.html

时间: 2024-09-30 19:16:40

行为型模式之 状态模式的相关文章

行为型模式之状态模式

概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式.状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,对于客户端而言,无须关心对象状态的转换以及对象所处的当前状态,无论对于何种状态的对象,客户端都可以一致处理. 定义 状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类

23行为型模式之状态模式

概念 State模式也叫状态模式,是行为设计模式的一种.State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转译到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化. 角色和职责 Context:用户对象 拥有一个State类型的成员,以标识对象的当前状态: State:接口或基类 封装与Context的特定状态相关的行为: ConcreteState:接口实现

【设计模式】 模式PK:策略模式VS状态模式

1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式.但根据两者的定义,我们发现两者的区别还是很明显的:策略模式封装的是不同的算法,算法之间没有交互,以达到算法可以自由切换的目的:而状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的.这两种模式虽然都有变换的行为,但

职责链模式vs状态模式区别

状态模式在具体状态里设置了下一状态. 而职责链模式是在客户端代码里设置了下一状态的处理对象. 如果状态模式里的任何一环缺失,将导致事情无法进行下去.职责链模式的链式在客户端连接的,也就是说,如果我们请假,请假制度一旦改变,比如说我们不需要班长,或者是先请求老师后直接请求主任或者中间多了一个环节,都是很容易实现的,所以,职责链模式要比状态模式灵活很多. 小时候写日记都是这么写的:上午七点起床,八点之前洗脸刷牙吃早饭,十二点之前好好上课,中午一点,吃午饭,下午两点到六点,上课,下课,找请假,明天妈妈

设计模式之策略模式和状态模式(strategy pattern &amp; state pattern)

本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过对比和实例介绍,相信应该会一些比较深刻的感知.最后在结合个人的体会简单聊一下对这两个模式的一些看法. 1. 模式概念 1.1 策略模式 运行时更改类的行为或算法,从而达到修改其功能的目的: 使用场景: 一个系统需要动态地在几种算法中选择一种,而这些算法之间仅仅是他们的行为不同. 此外决策过程中过多的

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

结构 意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 适用性 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为. 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态.这个状态通常用一个或多个枚举常量表示.通常, 有多个操作包含这一相同的条件结构.S t a t e模式将每一个条件分支放入一个独立的类中.这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化. 1 using Syste

【设计模式】策略模式 vs 状态模式

相同点:同为行为型策略模式,均通过context类封装一个具体行为,都提供一个封装的方法: 不同点: 1)从定义看:目的不同 策略模式:封装不同的算法,算法间没有交互,达到算法可以自由互换目的:  实际样例:人生不同阶段的主要工作:儿童->玩耍.成年->工作.比如加密算法的互换(AES->RSA) 状态模式:封装不同的状态,达到状态切换后行为随之发生改变的目的.      实际样例:从儿童 切换 成年,因为状态的变化(儿童到成年),主要工作内容发生了改变. 2)具体场景代码比对 场景:人

命令模式、状态模式、责任链模式区别(转)

命令模式:一次设定,统一执行.状态模式:    相当于If else if else:    设计路线:各个State类的内部实现(相当于If,else If内的条件)    执行时通过State调用Context方法来执行.职责链模式:    相当于Swich case    设计路线:客户设定,每个子类(case)的参数是下一个子类(case).    使用时,向链的第一个子类的执行方法传递参数就可以. ———————————————————————————————————— 命令模式:将多

【行为型模式】状态模式(state)之23种java设计模式

State接口类 public interface State { void handle(); } BookedState类 /** * 已预订状态 * @author Administrator * */ public class BookedState implements State { @Override public void handle() { System.out.println("房间已预订!别人不能定!"); } } CheckedInState类 /** * 已