:状态模式:GumballMachine
#ifndef __STATE_H__ #define __STATE_H__ #include <iostream> #include<stdlib.h> using namespace std; class GumballMachine; class State { public: State(); virtual ~State(); virtual void insertQuarter(); virtual void ejectQuarter(); virtual void turnCrank(); virtual void dispense(); }; class NoQuarterState : public State { private: GumballMachine *gumballmachine; public: NoQuarterState(GumballMachine *g); virtual ~NoQuarterState(); virtual void insertQuarter(); virtual void ejectQuarter(); virtual void turnCrank(); virtual void dispense(); }; class SoldOutState :public State { private: GumballMachine *gumballmachine; public: SoldOutState(GumballMachine *g); virtual ~SoldOutState(); virtual void insertQuarter(); virtual void ejectQuarter(); virtual void turnCrank(); virtual void dispense(); }; class HasQuarterState :public State { private: GumballMachine *gumballmachine; public: HasQuarterState(GumballMachine *g); virtual ~HasQuarterState(); virtual void insertQuarter(); virtual void ejectQuarter(); virtual void turnCrank(); virtual void dispense(); }; class SoldState :public State { private: GumballMachine *gumballmachine; public: SoldState(GumballMachine *g); virtual ~SoldState(); virtual void insertQuarter(); virtual void ejectQuarter(); virtual void turnCrank(); virtual void dispense(); }; class WinnerState :public State { private: GumballMachine *gumballmachine; public: WinnerState(GumballMachine *g); virtual ~WinnerState(); virtual void insertQuarter(); virtual void ejectQuarter(); virtual void turnCrank(); virtual void dispense(); }; #endif
#include "State.h" #include "GumballMachine.h" void State::dispense() { } void State::turnCrank() { } void State::ejectQuarter() { } void State::insertQuarter() { } State::~State() { } State::State() { } NoQuarterState::~NoQuarterState() { } NoQuarterState::NoQuarterState(GumballMachine *g) { gumballmachine = g; } void NoQuarterState::dispense() { cout << "You need to pay first." << endl; } void NoQuarterState::turnCrank() { cout << "You turned, but there is no quarter." << endl; } void NoQuarterState::ejectQuarter() { cout << "You has not insert quarter." << endl; } void NoQuarterState::insertQuarter() { cout << "You insert a quarter." << endl; gumballmachine->SetState(gumballmachine->GetHasQuarterState()); } void SoldOutState::dispense() { cout << "Sold out." << endl; } void SoldOutState::turnCrank() { cout << "Sold out, there is no quarter." << endl; } void SoldOutState::ejectQuarter() { cout << "Sold out, can't eject quarter." << endl; } void SoldOutState::insertQuarter() { cout << "Sold out, You can't insert a quarter." << endl; } SoldOutState::~SoldOutState() { } SoldOutState::SoldOutState(GumballMachine *g) { gumballmachine = g; } void HasQuarterState::dispense() { cout << "No gum ball dispensed." << endl; } void HasQuarterState::turnCrank() { cout << "You turned." << endl; int winner = (rand() % 10); if (winner == 0 && gumballmachine->getCount() > 1) { gumballmachine->SetState(gumballmachine->GetWinnerState()); } else { gumballmachine->SetState(gumballmachine->GetSoldState()); } } void HasQuarterState::ejectQuarter() { cout << "Quarter returned." << endl; gumballmachine->SetState(gumballmachine->GetNoQuarterState()); } void HasQuarterState::insertQuarter() { cout << "You can't insert another quarter." << endl; } HasQuarterState::~HasQuarterState() { } HasQuarterState::HasQuarterState(GumballMachine *g) { gumballmachine = g; } void SoldState::dispense() { gumballmachine->releaseBall(); if (gumballmachine->getCount() > 0) { gumballmachine->SetState(gumballmachine->GetNoQuarterState()); } else { cout << "Oops, out of gum balls!" << endl; gumballmachine->SetState(gumballmachine->GetSoldOutState()); } } void SoldState::turnCrank() { cout << "Turning twice does not get you another gum ball." << endl; } void SoldState::ejectQuarter() { cout << "Sorry, you already turned the crank." << endl; } void SoldState::insertQuarter() { cout << "Please wait, we are already giving you a gum ball." << endl; } SoldState::~SoldState() { } SoldState::SoldState(GumballMachine *g) { gumballmachine = g; } void WinnerState::dispense() { cout << "YOU ARE A WINNER, You get two gum balls." << endl; gumballmachine->releaseBall(); if (gumballmachine->getCount() == 0) { gumballmachine->SetState(gumballmachine->GetSoldOutState()); } else { gumballmachine->releaseBall(); if (gumballmachine->getCount() == 0) { gumballmachine->SetState(gumballmachine->GetSoldOutState()); } else { gumballmachine->SetState(gumballmachine->GetNoQuarterState()); } } } void WinnerState::turnCrank() { cout << "Turning twice does not get you another gum ball." << endl; } void WinnerState::ejectQuarter() { cout << "Sorry, you already turned the crank." << endl; } void WinnerState::insertQuarter() { cout << "Please wait, we are already giving you a gum ball." << endl; } WinnerState::~WinnerState() { } WinnerState::WinnerState(GumballMachine *g) { gumballmachine = g; }
#ifndef __GUMBALLMACHINE_H__ #define __GUMBALLMACHINE_H__ #include "State.h" #include <iostream> #include<stdlib.h> using namespace std; //class State; class GumballMachine { private: State *soldOutState; State *noQuarterState; State *hasQuarterState; State *soldState; State *winnerState; State *CurrentState; int Count; public: GumballMachine(int num); ~GumballMachine(); void insertQuarter(); void ejectQuarter(); void turnCrank(); void SetState(State *st); State * GetNoQuarterState(); State * GetWinnerState(); State * GetHasQuarterState(); State * GetSoldState(); State * GetSoldOutState(); void releaseBall(); int getCount(); }; #endif
#include "GumballMachine.h" int GumballMachine::getCount() { return Count; } void GumballMachine::releaseBall() { cout << "A ball comes rolling out the slot." << endl; if (Count != 0) { Count--; } } State * GumballMachine::GetSoldOutState() { return soldOutState; } State * GumballMachine::GetSoldState() { return soldState; } State * GumballMachine::GetHasQuarterState() { return hasQuarterState; } State * GumballMachine::GetWinnerState() { return winnerState; } State * GumballMachine::GetNoQuarterState() { return noQuarterState; } void GumballMachine::SetState(State *st) { CurrentState = st; } void GumballMachine::turnCrank() { CurrentState->turnCrank(); CurrentState->dispense(); } void GumballMachine::ejectQuarter() { CurrentState->ejectQuarter(); } void GumballMachine::insertQuarter() { CurrentState->insertQuarter(); } GumballMachine::~GumballMachine() { } GumballMachine::GumballMachine(int num) { Count = num; soldOutState = new SoldOutState(this); noQuarterState = new NoQuarterState(this); hasQuarterState = new HasQuarterState(this); winnerState = new WinnerState(this); soldState = new SoldState(this); if (Count > 0) { CurrentState = noQuarterState; } }
#include <iostream> #include "GumballMachine.h" using namespace std; int main() { GumballMachine *g = new GumballMachine(10); for (int i = 0; i < 11; i ++) { cout << "================================" << endl; g->insertQuarter(); g->turnCrank(); } return 0; }