设置好内部状态,然后依据不同的函数作为行为模式,进行状态转换。

有点像Finite Automata算法,两者的思想是一样的。

会Finite Automata,那么这个设计模式就非常easy了。

#pragma once
#include <stdlib.h>
#include <math.h>
#include <random>
#include <time.h> enum STATES
{
FULLY_RENTED, WAITING, GOT_APPLICATION, APARTMENT_RENTED
}; class RentalMethods
{
STATES state;
int numberOfAppartments;
public:
RentalMethods(int n):state(WAITING), numberOfAppartments(n)
{
srand((unsigned)time(NULL));
}
void getApplication()
{
switch (state)
{
case FULLY_RENTED:
puts("Sorry, we are fully rented.");
break;
case WAITING:
state = GOT_APPLICATION;
puts("Thanks for the application.");
break;
case GOT_APPLICATION:
puts("We already got your application.");
break;
case APARTMENT_RENTED:
puts("Hang on, we are renting you an apartment.");
break;
}
} void checkApplication()
{
bool yesOrNo = rand() % 2; switch (state)
{
case FULLY_RENTED:
puts("Sorry, we are fully rented.");
break;
case WAITING:
puts("You have to submit an application.");
break;
case GOT_APPLICATION:
{
if (yesOrNo && numberOfAppartments > 0)
{
puts("Congratulations, you were approved.");
state = APARTMENT_RENTED;
rentApartment();
}
else
{
puts("Sorry, you were not approved.");
state = WAITING;
}
}
break;
case APARTMENT_RENTED:
puts("Hang on, we are renting you an apartment.");
break;
}
} void rentApartment()
{
switch (state)
{
case FULLY_RENTED:
puts("Sorry, we are fully rented.");
break;
case WAITING:
puts("You have to submit an application.");
break;
case GOT_APPLICATION:
puts("You must have your application checked.");
break;
case APARTMENT_RENTED:
puts("Renting you an apartment...");
numberOfAppartments--;
dispenseKeys();
break;
}
} void dispenseKeys()
{
switch (state)
{
case FULLY_RENTED:
puts("Sorry, we are fully rented.");
break;
case WAITING:
puts("You have to submit an application.");
break;
case GOT_APPLICATION:
puts("You must have your application checked.");
break;
case APARTMENT_RENTED:
puts("Here are your key!");
state = WAITING;
break;
}
}
}; void States_Run()
{
RentalMethods rentalMethods(9); rentalMethods.getApplication();
rentalMethods.checkApplication();
}

执行有两种随机结果:

1

2

State Design Pattern 状态设计模式的更多相关文章

  1. State Design Pattern

    注: 转载自 https://www.geeksforgeeks.org/state-design-pattern/  [以便查阅,非原创] State Design Pattern State pa ...

  2. State模式(状态设计模式)

    State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...

  3. Proxy Design Pattern 代理设计模式

    代理设计模式.此模式是用于serverclient排序.互联网接入,也经常使用的类代理,我觉得这种感觉很复杂.但是,这种设计模式本身是非常easy的. 是一类调用另一个类的功能.客户调用类,实际工作是 ...

  4. 从壹开始 [ Design Pattern ] 之一 ║ 设计模式开篇讲

    缘起 不说其他的没用的开场白了,直接给大家分享三个小故事,都来自于我的读者粉丝(我厚着脸皮称为粉丝吧

  5. 说说设计模式~大话目录(Design Pattern)

    回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...

  6. 设计模式(Design Pattern)系列之.NET专题

    最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...

  7. java设计模式大全 Design pattern samples in Java(最经典最全的资料)

    java设计模式大全 Design pattern samples in Java(最经典最全的资料) 2015年06月19日 13:10:58 阅读数:11100 Design pattern sa ...

  8. State状态设计模式

    1.状态模式:改变对象的行为 一个用来改变类的(状态的)对象. 2:问题:当你自己实现 State 模式的时候就会碰到很多细节的问题,你必须根据自己的需要选择合适的实现方法, 比如用到的状态(Stat ...

  9. 简单工厂设计模式(Simple Factory Design Pattern)

    [引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见 ...

随机推荐

  1. Jsunpack

    http://www.baidu.com/#wd=jsunpack&rsv_bp=0&tn=baidu&rsv_spt=3&ie=utf-8&rsv_sug3= ...

  2. 我在北京找工作(二):java实现算法<1> 冒泡排序+直接选择排序

    工作.工作.找工作.经过1个多星期的思想斗争还是决定了找JAVA方面的工作,因为好像能比PHP的工资高点.呵呵 :-)  (其实我这是笑脸,什么QQ输入法,模拟表情都没有,忒不人性化了.) 言归正传, ...

  3. Linux中查看进程及杀死进程命令

    Linux中想杀死fcitx进程,然后再重启它. root@www.linuxidc.com:/home/zhangbin# ps -e | grep 'fcitx' 3405 ?        00 ...

  4.  D - 粉碎叛乱F - 其他起义

    D - 粉碎叛乱 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  5. 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析

    作者 : 韩曙亮 转载请著名出处 :  http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 ...

  6. 查看一个int数组里边的每个数字出现过几次

    public void aa() { int[] a = { 1, 2, 3, 4, 5, 4, 3, 2, 1 }; Hashtable ht = new Hashtable(); for (int ...

  7. 【Nginx】启动报错-端口被占用

    将下载的windows版nginx的压缩包nginx-1.4.2.zip解压到F:\server\nginx-1.4.2里面. dos命令键入: F: cd F:\server\nginx-1.4.2 ...

  8. 【转】lnmp_auto:自动化安装lnmp环境脚本

    原文链接: lnmp_auto:自动化安装lnmp环境脚本  这哥们整理的这篇博文很好  转载分享 博文转载如下: 源代码在github上:https://github.com/jianfengye/ ...

  9. 用nohup执行python程序时,print无法输出

    python -u参数:关闭输出缓冲 nohup python -u test.py > nohup.out 2>&1 &

  10. Android ImageView(scaleType属性)图片按比例缩放

    <ImageView android:id="@+id/img" android:src="@drawable/logo" android:scaleTy ...