一、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. hdu1506——Largest Rectangle in a Histogram

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  2. 使用MySQL Workbench建立数据库,建立新的表,向表中添加数据

    使用MySQL Workbench建立数据库,建立新的表,向表中添加数据 初学数据库,记录一下所学的知识.我用的MySQL数据库,使用MySQL Workbench管理.下面简单介绍一下如何使用MyS ...

  3. ISAPI_Rewrite不起作用的N种原因

    现在经常用到ISAPI_Rewrite,遇到的问题就是在本地测试的时候,一切没有问题,到服务器上,竟然不起作用.郁闷~经过我的一些探索,发现了比起作用的原因如下:1.IIS_WPG对ISAPI_Rew ...

  4. 【.NET进程通信】初探.NET中进程间通信的简单的实现

    转载请注明出处:http://blog.csdn.net/xiaoy_h/article/details/26090277 废话不多说,IPC就是进程间通信. 进程间通信能够採用的方法非常多,比方创建 ...

  5. Javascript作用域问题的构造函数的变量

    构造函数new对于使用.代表创建对象.此外,它可以被用作普通的函数调用,因为它也是一个功能. function Person(name) { this.name=name; } Person(12); ...

  6. Xcode 6 AutoLayout Size Classes

    1.基本概念 在iPad和iPhone 5出现之前,iOS设备就唯独一种尺寸. 我们在做屏幕适配时须要考虑的唯独设备方向而已. 而非常多应用并不支持转向,这种话就全然没有屏幕适配的工作了. 随着iPa ...

  7. HDU ACM 1088 Write a simple HTML Browser

    意甲冠军:出现<br>总结,出现<hr>出口'-',今天的字加上各行的假设是长于80然后包,每个字之前,留下一个空白格,为了输出新行结束. #include<iostre ...

  8. [Ext JS 4] 实战Chart 协调控制(单一的坐标,两个坐标)

    前言

  9. Java多线程&lt;1&gt;

    1.Java多线程的概念: 线(Thread):它指的是一个任务的从开始执行流程到结束. 穿线提供执行任务的机构.供java条款.在一个程序可以启动多个并发线程.候执行. 在单处理器系统中,多个线程共 ...

  10. ZOJ1463:Brackets Sequence(间隙DP)

    Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular seque ...