• 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();
    }

    执行有两种随机结果:


    2




  • 相关阅读:
    短信编码总结
    在Linux下用C语言实现短信收发
    sshd_config配置详解
    SSH的通讯和认证
    linux安装tacacs+服务器
    Tacacs+认证详细调研
    伪分布配置完成启动jobtracker和tasktracker没有启动
    Hadoop学习记录(7)|Eclipse远程调试Hadoop
    Hadoop学习记录(6)|Eclipse安装Hadoop 插件
    Hadoop学习记录(5)|集群搭建|节点动态添加删除
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3899532.html
Copyright © 2020-2023  润新知