设置好内部状态,然后依据不同的函数作为行为模式,进行状态转换。
有点像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