状态模式之C++实现

//state.h

#ifndef __STATE_H__
#define __STATE_H__

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

typedef enum
{
    CHILDREN = 1,
    PRIMARY_SCHOOL_STUDENT,
    MIDDLE_SCHOOL_STUDENT,
    UNIVERSITY_SCHOOL_STUDENT,
    GRADUATE_STUDENT,
    PROGRAMER,
} EDUCATION_TYPE_EN;

class Life;

class State
{
public:
    State() {}
    virtual void Operation(Life *life) {};
};

class Children : public State
{
public:
    Children(){}
    void Operation(Life *life);
};

class PrimarySchoolStudent : public State
{
public:
    void Operation(Life *life);
};

class MiddleSchoolStudent : public State
{
public:
    void Operation(Life *life);
};

class UniversitySchoolStudent : public State
{
public:
    void Operation(Life *life);
};

class GraduateStudent : public State
{
public:
    void Operation(Life *life);
};

class Programmer : public State
{
public:
    void Operation(Life *life);
};

#endif /* __STATE_H__ */

//state.cpp

#include "stdafx.h"

#include "state.h"

void Children::Operation(Life *life)
{
    if (life->GetAge() < 0)
    {
        cout << life->GetAge() << "岁时" << "未出生" << endl;
    }
    else if (life->GetAge() >= 0 && life->GetAge() < 6)
    {
        cout << life->GetAge() << "岁时" << "未上学" << endl;
    }
    else
    {
        life->SetState(new PrimarySchoolStudent);
        life->ShowState();
    }
}

void PrimarySchoolStudent::Operation(Life *life)
{
    if (life->GetAge() >= 6 && life->GetAge() < 12)
    {
        cout << life->GetAge() << "岁时" << "读小学" << endl;
    }
    else
    {
        life->SetState(new MiddleSchoolStudent);
        life->ShowState();
    }
}

void MiddleSchoolStudent::Operation(Life *life)
{
    if (life->GetAge() >= 12 && life->GetAge() < 18)
    {
        cout << life->GetAge() << "岁时" << "读中学" << endl;
    }
    else
    {
        life->SetState(new UniversitySchoolStudent);
        life->ShowState();
    }
}

void UniversitySchoolStudent::Operation(Life *life)
{
    if (life->GetAge() >= 18 && life->GetAge() < 22)
    {
        cout << life->GetAge() << "岁时" << "读大学" << endl;
    }
    else
    {
        life->SetState(new GraduateStudent);
        life->ShowState();
    }
}

void GraduateStudent::Operation(Life *life)
{
    if (life->GetAge() >= 22 && life->GetAge() < 25)
    {
        cout << life->GetAge() << "岁时" << "读研究生" << endl;
    }
    else
    {
        life->SetState(new Programmer);
        life->ShowState();
    }
}

void Programmer::Operation(Life *life)
{
    if (life->GetAge() >= 25)
    {
        cout << life->GetAge() << "岁时" << "成为码农,开始工作" << endl;
    }
    else
    {
        cout << "状态异常" << endl;
    }
}

//context.h

#ifndef __CONTEXT_H__
#define __CONTEXT_H__

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

class State;

class Life
{
private:
    int age;
    State *current;
public:
    Life();
    
    void SetState(State *state);

void SetAge(int age);

int GetAge() const;
    
    void ShowState();
};

#endif /* __CONTEXT_H__ */

//context.cpp

#include "stdafx.h"
#include "context.h"

Life::Life()
{
    current = new Children; //初始化最初状态
}

void Life::SetState(State *state)
{
    current = state;
}

void Life::SetAge(int age)
{
    this->age = age;
}

int Life::GetAge() const
{
    return this->age;
}

void Life::ShowState()
{
    current->Operation(this);
}

//test.cpp

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

int _tmain(int argc, _TCHAR* argv[])
{
    Life *pLife = new Life;
    pLife->SetAge(5);
    pLife->ShowState();

pLife->SetAge(10);
    pLife->ShowState();

pLife->SetAge(16);
    pLife->ShowState();

pLife->SetAge(18);
    pLife->ShowState();

pLife->SetAge(21);
    pLife->ShowState();

pLife->SetAge(23);
    pLife->ShowState();

pLife->SetAge(28);
    pLife->ShowState();
    return 0;
}

状态模式之C++实现

时间: 2024-08-28 18:46:23

状态模式之C++实现的相关文章

大话设计模式读书笔记--12.状态模式

定义 状态模式定义: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来改变了其类 消除庞大的条件分支,将特定状态的行为放入一个对象中 生活中:开灯和关灯是两个状态 模式结构 Context: 上下文环境,维护一个状态实例,定义当前的状态 State: 抽象状态类,定义一个接口,封装与Context的一个特定状态相关的行为 ConcreteState:具体状态.实现Context的一个特定状态相关的行为 代码实现 场景: 12店之前是休闲状态, 之后是忙碌状态 点击下载代码 特点及使用场

设计模式整理_状态模式

状态模式允许对象在内部状态改变的时候,改变它的行为,对象看起来好像修改了它的类.因为这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,而行为会随着内部状态而改变. 在状态模式中,Context内部持有状态,State接口定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样一来,各个状态可以互相替换.具体状态实现状态接口,所以当Context改变状态的时候,行为也跟着改变.而不管在什么时候,只要有人调用Context的具体方法,它就会用来委托状态处理,下面用具体事例

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

第十六章 状态模式

好处:将与特定状态相关的行为局部化,并将不同状态的行为分割开来. 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式. /** * Created by hero on 16-4-4. */ public abstract class State { public abstract void handle(Context context); } /** * Created by hero on 16-4-4. */ public class Con

23状态模式

 1状态模式的核心内容是: A:状态类 B:工作类 2状态模式的作用:通过状态值自动跳转到要执行的类. 3状态模式具体描述 状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为. 这个对象看上去象是改变了它的类一样.状态模式把所研究的对象的行 为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的 一个子类.状态模式的意图是让一个对象在其内部状态改变的时候, 其行为也随之改变.状态模式需要对每一个系统可能取得的状态创立一个状态类的 子类.当系统的状态变化时,系统便改变所选的子

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage

State状态模式(C++实现)

状态模式:状态模式的意图是,允许一个对象在其内部状态改变时,改变它的行为.看起来就像是改变了它的类一样. 主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化. 类图如下图所示 State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为.ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为.Context类,维护一个ConcreteState子类

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

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 2.模式特点: 状态模式的主要优点在于封装了转换规则,并枚举可能的状态,它将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,还可以

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

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