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

有点像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. Windows Phone 8初学者开发—第12部分:改进视图模型和示例数据

    原文 Windows Phone 8初学者开发—第12部分:改进视图模型和示例数据 第12部分:改进视图模型和示例数据 原文地址:http://channel9.msdn.com/Series/Win ...

  2. Linux的五个查找命令find,locate,whereis,which,type

    Linux的五个查找命令 1. find 最常见且最强大的命令,可以查找任何文件. 格式 $ find   指定目录   指定条件   指定动作   指定目录: 所要搜索的目录及其子目录,默认当前目录 ...

  3. 基于visual Studio2013解决C语言竞赛题之0204实数求值

     题目

  4. shell一些笔记

    1.getopts可以编写脚本,使控制多个命令行参数更加容易 如:文件get.sh #! /bin/sh NAME=false AGE=false ODD=false SEX=false while ...

  5. IBM 中国研究院面试经历

    继上次面试MSRA失败后,严重刺激了我幼小的心灵.从此苦学算法准备面试很多其它其它的公司刷一刷Offer以解心 头之恨. 这个带来的IBM 中国研究院的面试经历. IBM的面试相比于MSRA.简直就是 ...

  6. CodeForces 525C Ilya and Sticks 贪心

    题目:click here #include <iostream> #include <cstdio> #include <cstring> #include &l ...

  7. java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法

    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法 只需把这三个commons-pool.jar ...

  8. java实现随机验证码的图片

    链接地址:http://blog.sina.com.cn/s/blog_407a68fc010006qo.html 1.一共需要2个常用java文件(RandomCode.java和RandomCod ...

  9. Java-Math

    java.lang.Math类提供的方法都是static的,“静态引入 ”使得不必每次在调用类方法时都在方法前写上类名:             import static java.lang.Mat ...

  10. docker学习笔记15:Dockerfile 指令 USER介绍

    USER指令用于指定容器执行程序的用户身份,默认是 root用户. 在docker run 中可以通过 -u 选项来覆盖USER指令的设置. 举例:docker run -i -t -u mysql ...