zoukankan      html  css  js  c++  java
  • 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




  • 相关阅读:
    【读书笔记】iOS-网络-使用推送通知
    【读书笔记】iOS-网络-测试与操纵网络流量
    【读书笔记】iOS-网络-底层网络
    【读书笔记】iOS-网络-优化请求性能
    【读书笔记】iOS-网络-保护网络传输
    【读书笔记】iOS-网络-错误处理的经验法则
    【读书笔记】iOS-网络-三种错误
    【读书笔记】iOS-网络-理解错误源
    【读书笔记】iOS-网络-解析响应负载
    【读书笔记】iOS-网络-负载
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3899532.html
Copyright © 2011-2022 走看看