State Design Pattern 状态设计模式
设置好内部状态,然后依据不同的函数作为行为模式,进行状态转换。
有点像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 状态设计模式的更多相关文章
- State Design Pattern
注: 转载自 https://www.geeksforgeeks.org/state-design-pattern/ [以便查阅,非原创] State Design Pattern State pa ...
- State模式(状态设计模式)
State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...
- Proxy Design Pattern 代理设计模式
代理设计模式.此模式是用于serverclient排序.互联网接入,也经常使用的类代理,我觉得这种感觉很复杂.但是,这种设计模式本身是非常easy的. 是一类调用另一个类的功能.客户调用类,实际工作是 ...
- 从壹开始 [ Design Pattern ] 之一 ║ 设计模式开篇讲
缘起 不说其他的没用的开场白了,直接给大家分享三个小故事,都来自于我的读者粉丝(我厚着脸皮称为粉丝吧
- 说说设计模式~大话目录(Design Pattern)
回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...
- 设计模式(Design Pattern)系列之.NET专题
最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...
- java设计模式大全 Design pattern samples in Java(最经典最全的资料)
java设计模式大全 Design pattern samples in Java(最经典最全的资料) 2015年06月19日 13:10:58 阅读数:11100 Design pattern sa ...
- State状态设计模式
1.状态模式:改变对象的行为 一个用来改变类的(状态的)对象. 2:问题:当你自己实现 State 模式的时候就会碰到很多细节的问题,你必须根据自己的需要选择合适的实现方法, 比如用到的状态(Stat ...
- 简单工厂设计模式(Simple Factory Design Pattern)
[引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见 ...
随机推荐
- php 用户访问菜单页面,必须登录,判断用户是否登录
<pre name="code" class="python"># 本节课大纲: 一.空模块和空操作 1.空操作 function _empty($ ...
- fedora 下安装 文泉驿正黑体
1. 可以到文泉驿正黑体的 主页 http://wenq.org/wqy2/index.cgi?%E9%A6%96%E9%A1%B5 最好能去官网表示一下支持 2. 也可以直接使用命令 : sudo ...
- Linux下Django开发学习(一)
一,环境配置: 环境:Ubuntu 14.04 LTS, Python 2.7, Django 1.8 安装Python : Ubuntu自带python2.7,不用安装 安装pip:sudo ap ...
- Android线程和handler
根据视频仿照着写了个demo: package com.wyl.wylthreadtest; import android.graphics.Color; import android.os.Bund ...
- QT窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透
qt 窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透 窗口置顶qt 里是 setWindowFlags(Qt::WindowStaysOnTopHint)kde 里 ...
- linux c coding style
Linux kernel coding style This is a short document describing the preferred coding style for the lin ...
- 【JSP】JSTL核心标签库的使用方法和示例
JSTL 核心标签库 JSTL 核心标签库标签共有13个,功能上分为4类: 1. 表达式控制标签:out.set.remove.catch 2. 流程控制标签:if.choose.when.other ...
- 利用MySQL 的GROUP_CONCAT函数实现聚合乘法
MySQL 聚合函数里面提供了加,平均数.最小,最大等,可是没有提供乘法,我们这里来利用MYSQL现有的GROUP_CONCAT函数实现聚合乘法. 先创建一张演示样例表: CREATE TABLE ` ...
- Coursera Machine Learning 学习笔记(十二)
- Normal equation 到眼下为止,线性回归问题中都在使用梯度下降算法,但对于某些线性回归问题,正规方程方法是更好的解决方式. 正规方程就是通过求解例如以下方程来解析的找出使得代价函数最小 ...
- muduo 与 libevent2 吞吐量对照
libevent 是一款很好用的 C 语言网络库,它也採用 Reactor 模型,正好能够与 muduo 做一对照. 本文用 ping pong 測试来对照 muduo 和 libevent2 的吞吐 ...