大话设计模式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 ...
随机推荐
- solr与.net课程(七)solr主从复制
既然solr是解决大量数据全文索引的方案,因为高并发的问题,我们就要考虑solr的负载均衡了,solr提供很easy的主从复制的配置方法,那么以下我们就来配置一下solr的主从复制 如果我们在192. ...
- 使用MySQL Workbench建立数据库,建立新的表,向表中添加数据
使用MySQL Workbench建立数据库,建立新的表,向表中添加数据 初学数据库,记录一下所学的知识.我用的MySQL数据库,使用MySQL Workbench管理.下面简单介绍一下如何使用MyS ...
- zabbix 实现curl 显示器
1.进入Configure->Templates 2. 新建一个模板 3.新建模板,并保存 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFpND ...
- UVALive 6469 Deranged Exams (排列:力绝对是无辜的高中知识啊)
标题手段 : 给你个n([1,17])表达n无论从数据结构.然后n个对这些术语的定义,让你对这些术语和定义对号入座(相当于进行连线,A术语连A术语的定义).然后一个 k([0,n]).问你至少前k个术 ...
- [Aaronyang] 写给自己的WPF4.5 笔记15[AyArc诞生-WPF版本绚丽的环状图,Ay制作,AyWindow强势预览]
原文:[Aaronyang] 写给自己的WPF4.5 笔记15[AyArc诞生-WPF版本绚丽的环状图,Ay制作,AyWindow强势预览] 我的文章一定要做到对读者负责,否则就是失败的文章 -- ...
- 高仿淘宝送货地址暴走漫画系列(附demo)
演讲: 我是个程序员,一天我坐在路边一边喝水一边苦苦检查bug. 这时一个乞丐在我边上坐下了,開始要饭,我认为可怜.就给了他1块钱. 然后接着调试程序.他可能生意不好,就无聊的看看我在干什么.然后过了 ...
- 我学cocos2d-x (两) 采用Delegate(信托)
Delegate(信托)什么 Delegate是ios开发中的一个概念,主要是为了让类A中的功能,放到类B中来实现,这样能够合理的把功能划分到不同的文件里进行实现,从而更好的实现模块的分离.如UIAp ...
- JVM的参数详解(转)
12年毕业到先在处理第一年外这几年纯属于打酱油,当初自学Java然后就出来找工作了,还有第一家面试就通过了挺幸运的 但之后的这段时间一直是处于吃老本的状态.最近心情真的很不好,各种黄老邪!一直处于堕落 ...
- HDOJ 4745 Two Rabbits DP
Two Rabbits Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Tot ...
- C该结构变化 struct typedef
这几天看代码,看到若干类型的结构,例如下列结构声明: struct book{ string name; int price; int num; }; 此种结构定义结构变量的格式例如以下: ...