23状态模式



1状态模式的核心内容是:

A:状态类

B:工作类

2状态模式的作用:通过状态值自动跳转到要执行的类。

3状态模式具体描述

状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。

这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行

为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的

一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,

其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的

子类。当系统的状态变化时,系统便改变所选的子类。

 

MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,

比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”

,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”

,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,

当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

4状态模式类图

5.代码:

#include<iostream>

#include<string>

usingnamespacestd;

//状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。

//这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行

//为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的

//一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,

//其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的

//子类。当系统的状态变化时,系统便改变所选的子类。

//

//MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,

//比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”

//,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”

//,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,

//当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

classWork;

classState;

classForenonnState;

 

classState

{

public:

   //准柜台的基类,抽象类

   virtualvoidwriteProgram(Work *) = 0;

};

 

//实施工作的类,根据状态执行不同的操作

classWork

{

public:

   inthour;

   State *current;

   Work();

 

   voidwriteProgram()

   {

       current->writeProgram(this);

   }

};

 

//晚上状态

classEveningState :publicState

{

public:

   voidwriteProgram(Work *w)

   {

       cout <<"当前时间: " << w->hour << "心情很好,在看《明朝那些事儿》,收获很大!" << endl;

   }

};

 

//下午的状态

classAfternoonState :publicState

{

public:

   voidwriteProgram(Work *w)

   {

       if (w->hour < 19)

       {

           cout <<"当前时间:" << w->hour << "下午午睡后,工作还是精神百倍!" << endl;

       }

       else

       {

           w->current = newEveningState();

           w->writeProgram();

       }

   }

};

 

//上午的状态

classForenoonState :publicState

{

public:

   voidwriteProgram(Work *w)

   {

       if (w->hour < 12)

       {

           cout <<"当前时间:" << w->hour << "上午工作精神百倍!" << endl;

       }

       else

       {

           w->current = newAfternoonState();

           w->writeProgram();

       }

   }

};

 

Work::Work()

{

   current =newForenoonState();

}

 

intmain()

{

   Work *w =newWork();

   w->hour = 21;

   //通过状态模式自动跳转到要执行的类

   w->writeProgram();

   cin.get();

   return 0;

}

运行结果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涂作权的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值