HeadFirstデザパタ 第10章 State をC++で実装
自分のお勉強用 : HeadFirstデザパタ 第10章 State をC++で適当に実装
おさらい。
とりあえずStateAとBを順繰りに入れ替えるようなやつ。
お手本を真面目に写経するのは冗長なのでパス。
とりあえずStateAとBを順繰りに入れ替えるようなやつ。
お手本を真面目に写経するのは冗長なのでパス。
ファイル一覧
- State.h : インターフェイス
- StateA.h と StateA.cpp : 実装
- State.h と StateB.cpp : 実装
- GumballMachine.h と cpp
- state_cpp.cpp : メインクラス
実装
State.h : インターフェイス
#ifndef STATE_H
#define STATE_H
class State
{
public:
virtual ~State() {}
virtual void methodA() = 0;
virtual void methodB() = 0;
};
#endif // !STATE_H
StateA.h
#ifndef STATE_A_H
#define STATE_A_H
#include "State.h"
#include "GumballMachine.h"
class StateA : public State
{
friend class GumballMachine;
public:
StateA(GumballMachine* gm):gm_(gm) {}
virtual void methodA() ;
virtual void methodB() ;
private:
GumballMachine* gm_;
};
#endif // !STATE_A_H
StateA.cpp
#include "StateA.h" #includeusing namespace std; void StateA::methodA() { cout << "StateA::MethodA" << endl; } void StateA::methodB() { cout << "StateA::MethodB" << endl; gm_->setState( gm_->getStateB() ); cout << "StateChange : A -> B" << endl; }
StateB.h
#ifndef STATE_B_H
#define STATE_B_H
#include "State.h"
#include "GumballMachine.h"
class StateB : public State
{
friend class GumballMachine;
public:
StateB(GumballMachine* gm):gm_(gm) {}
virtual void methodA() ;
virtual void methodB() ;
private:
GumballMachine* gm_;
};
#endif // !STATE_B_H
StateB.cpp
#include "StateB.h" #includeusing namespace std; void StateB::methodA() { cout << "BBB::AAA" << endl; } void StateB::methodB() { cout << "BBB::BBB" << endl; gm_->setState( gm_->getStateA() ); cout << "StateChange : B -> A" << endl; }
GumballMachine.h
#ifndef GUMBALL_MACHINE_H
#define GUMBALL_MACHINE_H
#include "State.h"
class GumballMachine
{
public:
GumballMachine();
~GumballMachine();
void eventA() { state_->methodA(); }
void eventB() { state_->methodB(); }
void setState(State* s) { state_ = s; }
State* getStateA() { return sa; }
State* getStateB() { return sb; }
private:
State* state_;
State* sa;
State* sb;
};
#endif // !GUMBALL_MACHINE_H
GumballMachine.cpp
#include "GumballMachine.h"
#include "StateA.h"
#include "StateB.h"
GumballMachine::GumballMachine() {
sa = new StateA(this);
sb = new StateB(this);
state_ = sa;
}
GumballMachine::~GumballMachine()
{
delete sa;
delete sb;
}
state_cpp.cpp
#include "GumballMachine.h"
int main()
{
GumballMachine gm;
for (int i = 0; i < 3; i++) {
gm.eventA();
gm.eventB();
}
}
所感
ステータス周りはFlyweight的な意味でStaticでやってもよいし、Stateのメソッド部分はコマンドパターンを当ててもよいね。
コメント
コメントを投稿