状态模式 State

状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

Context中有成员变量标志其状态,在每次请求过后,在具体状态类中设置其变化至的类。

// State.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

class State;
class Context{
public:
    Context(){
        m_pstate = NULL;
    }
    void setState(State * pstate){
        m_pstate = pstate;
    }
    State * getState(){
        return m_pstate;
    }
    void request();

    ~Context(){
        delete m_pstate;
    }
private:
    State * m_pstate;
};

class State{
public:
    virtual void handle(Context * pcontext) = 0;
};
void Context::request(){

    if(this->m_pstate != NULL)
        this->m_pstate->handle(this);
    else
        cout<<"not set the origin state"<<endl;
}

class ConcreateState1:public State{
public:
    void handle(Context * pcontext);
};

class ConcreateState2:public State{
public:
    void handle(Context * pcontext);
};

class ConcreateState3:public State{    //当添加具体状态3时,添加状态3类,并在状态2中调整handle,将下一个状态设置为状态3,可以类比于链表
public:
    void handle(Context * pcontext);
};

void ConcreateState1::handle(Context * pcontext){
    cout<<"state1 "<<endl;
    delete pcontext->getState();
    pcontext->setState(new ConcreateState2);
}
void ConcreateState2::handle(Context * pcontext){
    cout<<"state2 "<<endl;
    delete pcontext->getState();
    pcontext->setState(new ConcreateState3);
}
void ConcreateState3::handle(Context * pcontext){
    cout<<"state3 "<<endl;
    delete pcontext->getState();
    pcontext->setState(new ConcreateState1);
}

int main(int argc, char* argv[])
{
    Context * pcontext = new Context;
    pcontext->setState(new ConcreateState1);   //设置当前状态
    for (int i = 0;i<10;i++)
    {
        pcontext->request();
    }
    delete pcontext;
    return 0;
}

时间: 2024-10-11 11:45:56

状态模式 State的相关文章

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

设计模式之状态模式(State)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

状态模式(State Pattern)

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理. 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为. 具体状态(Concrete State

设计模式 ( 十七) 状态模式State(对象行为型)

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

学习笔记——状态模式State

状态模式,主要是用于存在大量case判断的操作执行,同时这些case依赖于对象的状态,那么就可以将大量的case判断封装为独立的类. Context: -state,当前状态对象. ChangeState(state),切换state对象. OperationInterface(),调用State->OperationInterface. OperationChangeState(),调用State->OperationChangeState(Context). State: ChangeSt

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

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

设计模式之十二:状态模式(State)

状态模式: 当一个对象的内部状态发生变化时允许改变它的行为. Allow an object to alter its behavior when its internal state changes. The object will appear to change its class. 状态模式将依赖于状态的行为分离成了各种状态类,每一种特定的转态类只处理单一的行为,并且定义了各种状态之间的转移变迁关系. UML图: 主要包括: Context:定义了客户端需要的接口,操作了一个当前状态类的

[设计模式] 20 状态模式 State Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对于一个对象的状态,我们都是让这个对象包含一个状态的属性,这个状态属性记录着对象的具体状态,根据状态的不同使用分支结构来执行不同的功能,就像上面的代码那样处理:就像上面说的,类中存在大量的结构类似的分支语句,变得难以维护和理解.状态模式消除了分支语句,就像工厂模式消除了简单工厂模式的分支语句一样,将状态处理分散