行为型模型 状态模式

行为型模型 状态模式

Context:用户对象
        拥有一个State类型的成员,以标识对象的当前状态;
State:接口或基类
        封装与Context的特定状态相关的行为;
ConcreteState:接口实现类或子类
        实现了一个与Context某个状态相关的行为。

适用于:
        对象的行为,依赖于它所处的当前状态。行为随状态改变而改变的场景。

/**
 * 行为型模型 状态模式
 * State模式也叫状态模式,是行为设计模式的一种。
 * State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。
 * 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转译到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化。
 *
 */

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>

// 前置声明
class Context;

class State
{
public:
    virtual void doAction(Context * context) = 0;
    virtual std::string toString() = 0;
    virtual ~State() {}
};

class Context
{
public:
    Context()
    {
        state = nullptr;
    }

    void setState(State * state)
    {
        this->state = state;
    }

    State * getState()
    {
        return state;
    }

    void doAction()
    {
        if ( state == nullptr )
        {
            std::cout << "None state" << std::endl;
        }
        else
        {
            state->doAction(this);
        }
    }

private:
    State * state;
};

class StartState: public State
{
public:
    virtual void doAction(Context * context) override
    {
        if (context->getState() == nullptr)
        {
            std::cout << "None start state" << std::endl;
        }
        else
        {
            std::cout << context->getState()->toString() << ": Player is in start state" << std::endl;
        }
    }
    virtual std::string toString() override
    {
        return "Start State";
    }
};

class StopState: public State
{
public:
    virtual void doAction(Context * context) override
    {
        if (context->getState() == nullptr)
        {
            std::cout << "None stop state" << std::endl;
        }
        else
        {
            std::cout << context->getState()->toString() << ": Player is in stop state" << std::endl;
        }
    }
    virtual std::string toString() override
    {
        return "Stop State";
    }
};

void mytest()
{
    Context * context = new Context();
    StartState * startState = new StartState();
    StopState * stopState = new StopState();
    context->doAction();
    context->setState(startState);
    context->doAction();
    context->setState(stopState);
    context->doAction();

    delete stopState;
    stopState = nullptr;
    delete startState;
    startState = nullptr;
    delete context;
    context = nullptr;

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}
时间: 2024-10-07 15:25:32

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

行为型模型 备忘录模式

行为型模型 备忘录模式 应用场景 如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式. 1)一个类需要保存它的对象的状态(相当于Originator角色) 2)设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色) 3)需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存 4)undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状

行为型模型 迭代器模式

行为型模型 迭代器模式 GOOD:提供一种方法顺序访问一个聚敛对象的各个元素,而又不暴露该对象的内部表示. 为遍历不同的聚集结构提供如开始,下一个,是否结束,当前一项等统一接口. Iterator(迭代器接口):         该接口必须定义实现迭代功能的最小定义方法集         比如提供hasNext()和next()方法. ConcreteIterator(迭代器实现类):         迭代器接口Iterator的实现类.可以根据具体情况加以实现. Aggregate(容器接口)

行为型模型 模版模式

行为型模型 模版模式 应用场景 Template Method模式一般应用在具有以下条件 的应用中:        - 具有统一的操作步骤或操作过程         - 具有不同的操作细节         - 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同总结:        在抽象类中统一操作步骤,并规定好接口:让子类实现接口.这样可以把各个具体的子类和操作步骤接耦合 AbstractClass:        抽象类的父类 ConcreteClass:         具

行为型模型 策略模式

行为型模型 策略模式 Strategy:        策略(算法)抽象. ConcreteStrategy         各种策略(算法)的具体实现. Context         策略的外部封装类,或者说策略的容器类.根据不同策略执行不同的行为.策略由外部环境决定. 好处:         //算法的实现 和 客户端的使用 解耦合         //使得算法变化,不会影响客户端 适用于:         准备一组算法,并将每一个算法封装起来,使得它们可以互换. /** * 行为型模型

行为型模型 命令模式

行为型模型 命令模式 Command         Command命令的抽象类. ConcreteCommand         Command的具体实现类. Receiver         需要被调用的目标对象. Invorker         通过Invorker执行Command对象. 适用于:         是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. /** * 行为型模型 命令模式 * Command模

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

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之模板方法模式(Template Method Pattern)>http://blog.csdn.net/yanbober/article/details/45501715 概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.当系统中

设计模式(行为型)之模板方法模式(Template Method Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之命令模式(Command Pattern)>http://blog.csdn.net/yanbober/article/details/45500113 概述 模板方法模式是一种基于继承的代码复用,它是一种类行为型模式:是结构最简单的行为型设计模式,在其结构

java设计模式--行为型模式--状态模式

什么是行为型模式,小编觉得就是对行为的一种描述啦,一种对某种行为模型的定义. 状态模式: 1 状态模式 2 概述 3 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 4 5 6 适用性 7 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 8 9 2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态. 10 这个状态通常用一个或多个枚举常量表示. 11 通常,有多个操作包含这一相同的条件结构.

行为型模式之状态模式

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