设计模式--状态模式

来源:互联网 发布:淘宝宝贝关联阿里巴巴 编辑:程序博客网 时间:2024/06/10 04:14

状态模式的分类是属于对象行为型.首先是状态模式的定义:
当一个对象的内在状态发生改变时允许改变其行为,这个对象看起来是改变了其类.
状态模式的结构图:
状态模式结构图
适用性:
1 一个对象的行为取决与他的状态,并且在运行时刻可以根据状态改变他的行为
2 当一个操作中含有大量的判断分支语句,造成维护成本高的时候,此时可以把每一个判断分支放入独立的类中,使得每个判断分支都可以独立的发生变化,而不需要依赖其他的分支
协作
1 Context将于状态相关的请求委托给当前的ConcreteState类进行处理
2 Context可以将自身传递给进行处理状态的对象,使得具体状态类在必要时可以访问Context
3 Context是客户使用的接口,当客户配置好该接口后,客户通过Context与具体的处理状态的对象通信,不再直接与具体的状态类通信
4 Context或者是具体的状态对象类可以决定哪个状态是哪个状态的后继者 和转换的条件
优点
1 状态模式将特定状态的行为局部化,并且将不同的状态行为分割开来。状态模式将状态封装在一个对象中,另外一个实现的方法是在Context中通过数值定义来定义状态的装换,但这样会使得出现相似的条件语句,State模式避免了这个问题。子类虽然增多了,但代码的结构化更加好,意图更加明显。
2 使得状态的转换显示化,通过数值转换状态往往不够明显,但通过子类的定义可以使得状态转换显示化
3 Stage对象可以被共享
注意
1 谁定义状态转换,状态转换如果是固定的,完全可以在context中定义。但如果分散在各个子类中,往往会更加灵活,缺点是各个子类产生了依赖
2 表驱动,可以用表来定义状态的转换,优点是不改变代码实现状态的转换。缺点是1 效率比较低,2 难以理解,3 难以加入伴随状态改变的动作
3 创建销毁状态对象
1 需要是在创建,当状态对象包含大量存储信息是适用
2 状态频繁改变时,适用
4 使用动态继承
例子

// StateModel.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "Work.h"int _tmain(int argc, _TCHAR* argv[]){    Work* project = new Work;    project->setHour(9);    project->writeProgram();    project->setHour(10);    project->writeProgram();    project->setHour(12);    project->writeProgram();    project->setHour(13);    project->writeProgram();    project->setHour(14);    project->writeProgram();    project->setHour(17);    project->setTaskFinished(false);    project->writeProgram();    project->setHour(19);    project->writeProgram();    project->setHour(22);    project->writeProgram();    delete project;    project = nullptr;    return 0;}/************************************************************************@fileName:Work.h @function: 状态模式的Context类@author: jaime@ver: 1.0.0************************************************************************/#pragma onceclass State;class ForenoonState;class Work{public:    Work();    ~Work();    void setHour(int hour);    int  getHour();    void setTaskFinished(bool finish);    bool getTaskFinished();    void setState(State* state);    void writeProgram();private:    State* m_current;    int    m_hour;    bool   m_finish;};#include "ForenoonState.h"#include "Work.h"Work::Work():m_current(new ForenoonState){}Work::~Work(){}void Work::setHour(int hour){    m_hour = hour;}int Work::getHour(){    return m_hour;}void Work::setTaskFinished(bool finish){    m_finish = finish;}bool Work::getTaskFinished(){    return m_finish;}void Work::setState(State* state){    m_current = state;}void Work::writeProgram(){    m_current->writeProgram(this);}/************************************************************************@fileName:State.h @function: 状态模式状态的基类@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "Work.h"class State{public:    State();    ~State();    virtual void writeProgram(Work* work) = 0;private:};/************************************************************************@fileName:ForenoonState.h @function: 状态模式具体的状态子类@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "State.h"class ForenoonState : public State{public:    ForenoonState();    ~ForenoonState();    virtual void writeProgram(Work* work);private:};  #include "ForenoonState.h"#include <iostream>#include "NoonState.h"using namespace std;ForenoonState::ForenoonState(){}ForenoonState::~ForenoonState(){}void ForenoonState::writeProgram(Work* work){    if ( work->getHour() < 12)    {        cout << "当前时间:" << work->getHour() << "精神百倍" <<endl;    }    else    {        work->setState(new NoonState);        work->writeProgram();    }}/************************************************************************@fileName:AfternoonState.h@function: 状态模式具体的状态子类@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "State.h"class AfternoonState : public State{public:    AfternoonState();    ~AfternoonState();    virtual void writeProgram(Work* work);private:};#include "AfternoonState.h"#include "EveningState.h"#include <iostream>using namespace std;AfternoonState::AfternoonState(){}AfternoonState::~AfternoonState(){}void AfternoonState::writeProgram(Work* work){    if (work->getHour() < 17)    {        cout << "当前时间:" << work->getHour() << "状态不错,继续努力" << endl;    }    else    {        work->setState(new EveningState);        work->writeProgram();    }}/************************************************************************@fileName:EveningState.h@function: 状态模式具体的状态子类@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "State.h"class EveningState : public State{public:    EveningState();    ~EveningState();    virtual void writeProgram(Work* work);private:};#include "EveningState.h"#include <iostream>#include "ResteState.h"#include "SleepingState.h"using namespace std;EveningState::EveningState(){}EveningState::~EveningState(){}void EveningState::writeProgram(Work* work){    if (work->getTaskFinished())    {        work->setState(new ResteState);        work->writeProgram();    }    else    {        if (work->getHour() < 21)        {            cout << "当前时间:" << work->getHour() << "加班,劳累" << endl;        }        else        {            work->setState(new SleepingState);            work->writeProgram();        }    }}/************************************************************************@fileName:ResteState.h@function: 状态模式具体的状态子类@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "State.h"class ResteState : public State{public:    ResteState();    ~ResteState();    virtual void writeProgram(Work* work);private:};#include "ResteState.h"#include <iostream>using namespace std;ResteState::ResteState(){}ResteState::~ResteState(){}void ResteState::writeProgram(Work* work){    cout << "当前时间:" << work->getHour() << "回家了" << endl;}/************************************************************************@fileName:SleepingState.h@function: 状态模式具体的状态子类@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "State.h"class SleepingState : public State{public:    SleepingState();    ~SleepingState();    virtual void writeProgram(Work* work);private:};#include "SleepingState.h"#include <iostream>using namespace std;SleepingState::SleepingState(){}SleepingState::~SleepingState(){}void SleepingState::writeProgram(Work* work){    cout << "当前时间:" << work->getHour() << "受不了了睡觉了" << endl;}
0 0
原创粉丝点击