#include <iostream>
#include <memory>
class Context;
class State {
public:
virtual void handle1(Context *c) = 0;
virtual void handle2(Context *c) = 0;
};
class Context {
public:
Context(std::shared_ptr<State> s) : s_(s) {}
void handle1() {
std::cout << "In Context handle1." << std::endl;
s_->handle1(this);
}
void handle2() {
std::cout << "In Context handle2." << std::endl;
s_->handle2(this);
}
void changeState(std::shared_ptr<State> s) { s_ = s; }
private:
std::shared_ptr<State> s_;
};
class ConcreteState1 : public State {
public:
void handle1(Context *c) override {
std::cout << "In ConcreteState1 handle1." << std::endl;
}
void handle2(Context *c) override;
};
class ConcreteState2 : public State {
public:
void handle1(Context *c) override {
std::cout << "In ConcreteState2 handle1." << std::endl;
}
void handle2(Context *c) override {
std::cout << "In ConcreteState2 handle2." << std::endl;
std::shared_ptr<State> s1 = std::make_shared<ConcreteState1>();
c->changeState(s1);
}
};
void ConcreteState1::handle2(Context *c) {
std::cout << "In ConcreteState1 handle2." << std::endl;
std::shared_ptr<State> s1 = std::make_shared<ConcreteState2>();
c->changeState(s1);
}
int main(int argc, char *argv[]) {
std::shared_ptr<State> s = std::make_shared<ConcreteState1>();
std::shared_ptr<Context> c = std::make_shared<Context>(s);
c->handle1();
c->handle2();
c->handle1();
c->handle2();
c->handle2();
return 1;
}