一、UML画画

二、概念

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

三、说明

以下是来自书本和网络的对状态模式的定义和分析:

(1)状态模式同意对象在内部状态改变时改变它的行为,对象看起来好像改动了它的类。看起来,状态模式好像是神通广大非常厉害似的——竟然可以“改动自身的类”!

(2)适用场景:

a)状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。

把状态的推断逻辑转移到表示不同状态的一系列类中,能够把复杂的判 断逻辑简单化。(简单来说,就是把各种if else 转变成了一个个的详细状态,原来if else 每种情况下的操作如今转换到了某个详细状态中)

b)当一个对象行为取决于它的状态,而且它必须在执行时刻依据状态改变它的行为时。就能够考虑使用状态模式了。



四、角色

(1)Context类:在该类内部维护一个ConcreteState子类的一个实例,这个实例定义当前的状态。

(2)State类:抽象状态类,定义一个 接口以封装与Context的一个特定状态相关的行为。

(3)ConcreteStateA,ConcreteStateB类:详细状态类。每个子 类实现一个与Context的一个状态相关的行为。



五、C++实现

(1)State.h(抽象状态类和详细状态类的声明和定义都在State.h和State.cpp中)

#ifndef STATE
#define STATE //#include "Work.h"
extern class Work; class State
{
public:
State(){};
virtual void writeProgram(Work* w){};
}; class ForenoonState:public State
{
public:
void writeProgram(Work* w);
}; class NoonState:public State
{
public:
void writeProgram(Work* w);
}; class AfternoonState:public State
{
public:
void writeProgram(Work* w);
}; class EveningState:public State
{
public:
void writeProgram(Work* w);
}; class SleepingState:public State
{
public:
void writeProgram(Work* w);
}; class RestState:public State
{
public:
void writeProgram(Work* w);
}; #endif

(2)State.cpp

#include <iostream>
#include "State.h"
#include "Work.h" using namespace std; void ForenoonState::writeProgram(Work* w)
{
if(w->getHour()<12)
{
cout<<"当前时间:"<<w->getHour()<<"点 "<<"上午工作,精神百倍"<<endl;
}
else
{
w->setState(new NoonState);
w->writeProgram();
}
} void NoonState::writeProgram(Work* w)
{
if(w->getHour()<13)
{
cout<<"当前时间:"<<w->getHour()<<"点 "<<"饿了,午饭。犯困。午休"<<endl;
}
else
{
w->setState(new AfternoonState);
w->writeProgram();
}
} void AfternoonState::writeProgram(Work* w)
{
if(w->getHour()<17)
cout<<"当前时间:"<<w->getHour()<<"点 "<<"下午状态还不错,继续努力"<<endl;
else
{
w->setState(new EveningState);
w->writeProgram();
}
} void EveningState::writeProgram(Work* w)
{
if(w->getFinish())
{
w->setState(new RestState);
w->writeProgram();
}
else
{
if(w->getHour()<21)
cout<<"当前时间:"<<w->getHour()<<"点 "<<"加班哦,疲惫至极"<<endl;
else
{
w->setState(new SleepingState);
w->writeProgram();
}
}
} void SleepingState::writeProgram(Work* w)
{
cout<<"当前时间:"<<w->getHour()<<"点 "<<"不行了,睡着了"<<endl;
} void RestState::writeProgram(Work* w)
{
cout<<"当前时间:"<<w->getHour()<<"点 "<<"下班回家了"<<endl;
}

(3)Work.h(这里的Work就是状态模式中的Context)

#ifndef WORK
#define WORK #include "State.h" class Work
{
private:
State* current; double Hour;
bool finish; public:
Work();
~Work(); double getHour();
void setHour(double HOUR); bool getFinish();
void setFinish(bool FINISH); void setState(State* s); void writeProgram();
}; #endif

(4)Work.cpp

#include "Work.h"

Work::Work()
{
current=new ForenoonState;
Hour=9;
finish=false;
} Work::~Work()
{
if(current!=0)
delete current;
} double Work::getHour()
{
return Hour;
}
void Work::setHour(double HOUR)
{
Hour=HOUR;
} bool Work::getFinish()
{
return finish;
}
void Work::setFinish(bool FINISH)
{
finish=FINISH;
} void Work::setState(State* s)
{
if(current!=0)
delete current; current=s;
} void Work::writeProgram()
{
current->writeProgram(this);
}

(5)main.cpp(client)

#include <iostream>
#include <cstdlib>
#include "Work.h"
//#include "State.h" using namespace std; void main()
{
Work emergencyProjects; emergencyProjects.setHour(9);
emergencyProjects.writeProgram(); emergencyProjects.setHour(10);
emergencyProjects.writeProgram(); emergencyProjects.setHour(12);
emergencyProjects.writeProgram(); emergencyProjects.setHour(13);
emergencyProjects.writeProgram(); emergencyProjects.setHour(14);
emergencyProjects.writeProgram(); emergencyProjects.setHour(17);
emergencyProjects.writeProgram(); emergencyProjects.setFinish(false); emergencyProjects.setHour(19);
emergencyProjects.writeProgram(); emergencyProjects.setHour(22);
emergencyProjects.writeProgram(); system("pause");
}

注意:上面的代码会出现两个类相互调用的情况。请查看日志:C++中两个类互相引用的解决方法

(6)执行截图

版权声明:本文博主原创文章,博客,未经同意不得转载。

大话设计模式C++达到-文章16章-国家模式的更多相关文章

  1. 大话设计模式C++达到-文章12章-外观模式

    一.UML画画 关键词:添加Facade层. 二.概念 外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加easy使用. 三.说明 Q:外观模式在什 ...

  2. 大话设计模式C++实现-文章7章-代理模式

    一个.UML画画 二.概念 代理模式:为其它对象提供一种代理以控制对这个对象的訪问. 三.应用场景 (1)远程代理.也就是为一个对象在不同的地址空间提供局部代表.这样能够隐藏一个对象存在于不同地址空间 ...

  3. 大话设计模式C++实现-第22章-桥接模式

    一.UML图 二.概念 桥接模式(Bridge):将抽象部分与它的实现部分分离,使他们都能够独立地变化. 三.说明 为什么叫"桥接模式"? 如上所看到的的UML图中,有一个聚合线, ...

  4. 大话设计模式C++实现-第19章-组合模式

    一.UML图 关键词:Leaf是叶子,Composite是非叶子节点,Composite包括Leaf. 二.概念 组合模式(Composite):将对象组合成树形结构以表示"部分-总体&qu ...

  5. 设计模式之第16章-代理模式(Java实现)

    设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...

  6. 大话设计模式C++实现-第1章-简单工厂模式

    一.UML图 二.包括的角色 简单工厂模式包括三个角色: (1)工厂类Factory:工厂类是用来制造产品的. 因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类 ...

  7. 大话设计模式C++实现-第15章-抽象工厂模式

    一.UML图 二.概念 抽象方法模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们详细的类. 三.包括的角色 (1)抽象工厂 (2)详细工厂:包含详细 ...

  8. 大话设计模式C++实现-第14章-观察者模式

    一.UML图 关键词:Subject维护一个Observer列表.Subject运行Notify()时就运行列表中的每一个Observer的Update(). 二.概念 观察者模式:定义了一种一对多的 ...

  9. 大话设计模式C++实现-第8章-工厂方法模式

    一.UML图 二.概念 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到其子类. 三.包括的角色 (1)抽象工厂 (2 ...

随机推荐

  1. 【iOS】文件上传小记

    iOS由该系统提供API可以实现可以实现文件的上传和下载,有两种方法来. NSURLConnection与NSURLSession. 当中NSURLConnection是使用非常久的的一种方式.NSU ...

  2. System.Threading.ThreadStateException

    异常:"System.Threading.ThreadStateException"在未处理的异常类型 System.Windows.Forms.dll 发生 其它信息: 在能够调 ...

  3. CMSIS标准

    CMSIS 标准(Cortex Microcontroller Software Interface Standard) ,翻译过来是"ARM Cortex™ 微控制器软件接口标准" ...

  4. 基于RDP开源许可rdesktop基本介绍

    **************************************************************************************************** ...

  5. 父类中可继承方法在处理private的一个demo

    public abstract class AbstractParent { public AbstractParent() { System.out.println("Hello,pare ...

  6. 认识javascript范围和作用域链

    范围 作用域就是变量和函数的可訪问范围.控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域. 全局和局部作用域以下用一张图来解释: 单纯的JavaScri ...

  7. 一C++PSO(PSO)算法

    收集和变化PSO算法,它可用于参考实施: #include <cstring> #include <iostream> #include <cmath> #incl ...

  8. Kohana 数据库

    只要不使用官方网站的教程,自己摸索出来的,有一个错误,当我们指了出来,哦,,好吧共同进步~ 首先配置:modules\database\config\database.php <?php 'de ...

  9. 第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁

    原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测 ...

  10. 使用SQLCMD在SQLServer执行多个脚本

    原文:使用SQLCMD在SQLServer执行多个脚本 概述: 作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个 ...