大话设计模式C++达到-文章16章-国家模式
一、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章-国家模式的更多相关文章
- 大话设计模式C++达到-文章12章-外观模式
一.UML画画 关键词:添加Facade层. 二.概念 外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加easy使用. 三.说明 Q:外观模式在什 ...
- 大话设计模式C++实现-文章7章-代理模式
一个.UML画画 二.概念 代理模式:为其它对象提供一种代理以控制对这个对象的訪问. 三.应用场景 (1)远程代理.也就是为一个对象在不同的地址空间提供局部代表.这样能够隐藏一个对象存在于不同地址空间 ...
- 大话设计模式C++实现-第22章-桥接模式
一.UML图 二.概念 桥接模式(Bridge):将抽象部分与它的实现部分分离,使他们都能够独立地变化. 三.说明 为什么叫"桥接模式"? 如上所看到的的UML图中,有一个聚合线, ...
- 大话设计模式C++实现-第19章-组合模式
一.UML图 关键词:Leaf是叶子,Composite是非叶子节点,Composite包括Leaf. 二.概念 组合模式(Composite):将对象组合成树形结构以表示"部分-总体&qu ...
- 设计模式之第16章-代理模式(Java实现)
设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...
- 大话设计模式C++实现-第1章-简单工厂模式
一.UML图 二.包括的角色 简单工厂模式包括三个角色: (1)工厂类Factory:工厂类是用来制造产品的. 因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类 ...
- 大话设计模式C++实现-第15章-抽象工厂模式
一.UML图 二.概念 抽象方法模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们详细的类. 三.包括的角色 (1)抽象工厂 (2)详细工厂:包含详细 ...
- 大话设计模式C++实现-第14章-观察者模式
一.UML图 关键词:Subject维护一个Observer列表.Subject运行Notify()时就运行列表中的每一个Observer的Update(). 二.概念 观察者模式:定义了一种一对多的 ...
- 大话设计模式C++实现-第8章-工厂方法模式
一.UML图 二.概念 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到其子类. 三.包括的角色 (1)抽象工厂 (2 ...
随机推荐
- ABP-N层架构
ABP理论学习之N层架构 返回总目录 自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析, ...
- iis6开户gzip 网站属性里面没有服务选项卡
请注意一点,是直接在名为“网站”的文件夹上面右键选择属性,不是去点下面建立的某一个网站.开户GZIP是整台服务器上面的虚拟主机都同时开启的,不对针某一个单独网站. 开启Gzip具体步骤: 1. 在 & ...
- C#中对于float,double,decimal的误解
原文:C#中对于float,double,decimal的误解 一直很奇怪C#的预定义数据类型中为什么加了一个decimal,有float和double不就够了吗?今天来挖一挖. 浮点型 如果我们在代 ...
- 有人实践过 Phabricator 以及 Arcanist 作为 code review 的工具么?(转)
作者:覃超链接:http://www.zhihu.com/question/19977889/answer/13539702来源:知乎 平时就经常实践. 整个公司的code review就是使用这个. ...
- 高榕资本宾悦:未使用的企业家Testin云测试服务类故障
高榕资本岳斌:创业者未使用Testin云測试服务属不合格 2014/10/09 · Testin · 开发人员訪谈 Testin云測与工信部等联合承办的ICT中国.2014高层论坛之移动开发人员分论坛 ...
- linux 下安装mysql
看以下这篇文章就够了 http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html 查看有没有安装过: ...
- MySQL存储过程:用户授权量
写这些脚本需求放缓的调查记录到数据库,方便观看. 1. 因为默认mysql.slow_log表使用csv数据引擎,该数据不支持指数,因此,有必要改变MyISAM发动机.和query_time字段索引, ...
- STL中间set具体用法!!!!
1.关于set C++ STL 之所以得到广泛的赞誉,也被非常多人使用.不仅仅是提供了像vector, string, list等方便的容器,更重要的是STL封装了很多复杂的数据结构算法和大量经常使用 ...
- js实现鼠标拖拽div-------Day44
假设去问这样一个问题"你认为鼠标操作简单,还是键盘操作简单",相信会有多数人都会回答鼠标吧,毕竟键盘button那么多,假设手小了或者手法不规范了,太easy出问题了,也对操作的速 ...
- WPF学习(12)动画
本篇来学习WPF的动画.什么是动画?动画就是一系列帧.在WPF中,动画就是在一段时间内修改依赖属性值的行为,它是基于时间线Timeline的.有人会说,要动画干嘛,华而不实,而且添加了额外的资源消耗而 ...