大话设计模式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 ...
随机推荐
- IntelliJ 15 unmapped spring configuration files found
IntelliJ Spring Configuration Check 用IntelliJ 导入现有工程时,如果原来的工程中有spring,每次打开工程就会提示:Spring Configuratio ...
- node.js基础:模块的创建和引入
模块可能是一个文件,也可能是包含一个或多个文件的目录.如果模块是个目录,node.js通常会在这个目录下找一个叫index.js的文件作为模块的入口. 典型的模块是一个包含exports对象属性定义的 ...
- BZOJ 2431 HAOI2009 在列的数目的顺序相反 递归
标题效果:乞讨1~n有都布置在物种的数目相反的顺序k计划数 订购f[i][j]对于前者i原子的反向排列的数j计划数 因此,我们将第一i插入的数1~i-1该装置 能生产0~i-1反向对 再就是 f[i] ...
- ZOJ3819 ACM-ICPC 2014 亚洲区域赛的比赛现场牡丹江司A称号 Average Score 注册标题
Average Score Time Limit: 2 Seconds Memory Limit: 131072 KB Bob is a freshman in Marjar Univers ...
- java提高篇(十三)-----字符串
可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为f ...
- FastReport扩展类
题记: 最近有在用FastReport进行开发报表工作,当然也有在看书,突然想到可以用书中所写来实现一个fastreport的帮助类. 对于引用第三方类库,我们都会去将这个库在调用前进行相应的封装,也 ...
- SQLServer RESOURCE_SEMAPHORE 等待状态
原文:SQLServer RESOURCE_SEMAPHORE 等待状态 概述: 当一个SQLServer实例运行得很慢的时候,应该做一些检查,如检查等待状态.最好的方法是一开始就建立一个性能基线,以 ...
- AndroidMainifest标签说明2——<activity>
格公式: <activity android:allowTaskReparenting=["true" | "false"] android:always ...
- Go如何发送广播包
发送网络数据包成三种方式,每间单播.组播.广播. 广播通俗地讲,就是让你的机器发送的数据包能够被同一个网络内的全部主机都接收到. 在解说怎样发送广播包之前.先来看看跟广播有关的知识: 我们都知道IP地 ...
- Hadoop-2.2.0中国文献—— Web应用代理
Web应用代理是YARN的一部分. 默认地,它会作为 Resource Manager(RM)的一部分来执行, 可是也能够配置成独立执行的模式.使用代理的原因就是减少通过YARN的web攻击的可能性. ...