如果对象不同状态会去执行不同的命令,并跳转到另一个状态,那么这个状态可以抽象出一个基类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| #include <iostream> #include <memory> #include <string>
class MusicPlayer; class PlayerStatue { public: virtual ~PlayerStatue() {} virtual void play(MusicPlayer &player) = 0; virtual void pause(MusicPlayer &player) = 0; virtual void stop(MusicPlayer &player) = 0; };
class MusicPlayer { public: void setState(std::unique_ptr<PlayerStatue> state) { m_state = std::move(state); }
void play() { m_state->play(*this); } void pause() { m_state->pause(*this); } void stop() { m_state->stop(*this); } private: std::unique_ptr<PlayerStatue> m_state; };
class PlayingState : public PlayerStatue { public: void play(MusicPlayer &player) override; void pause(MusicPlayer &player) override; void stop(MusicPlayer &player) override; }; class PauseState : public PlayerStatue { public: void play(MusicPlayer &player) override; void pause(MusicPlayer &player) override; void stop(MusicPlayer &player) override; }; class StopState : public PlayerStatue { public: void play(MusicPlayer &player) override; void pause(MusicPlayer &player) override; void stop(MusicPlayer &player) override; };
void PlayingState::play(MusicPlayer &player) { std::cout << "已经在播放状态了" << std::endl; } void PlayingState::pause(MusicPlayer &player) { std::cout << "暂停" << std::endl; player.setState(std::make_unique<PauseState>()); } void PlayingState::stop(MusicPlayer &player) { std::cout << "停止" << std::endl; player.setState(std::make_unique<StopState>()); }
void PauseState::play(MusicPlayer &player) { std::cout << "播放" << std::endl; player.setState(std::make_unique<PlayingState>()); } void PauseState::pause(MusicPlayer &player) { std::cout << "已经在暂停状态了" << std::endl; } void PauseState::stop(MusicPlayer &player) { std::cout << "停止" << std::endl; player.setState(std::make_unique<StopState>()); }
void StopState::play(MusicPlayer &player) { std::cout << "播放" << std::endl; player.setState(std::make_unique<PlayingState>()); } void StopState::pause(MusicPlayer &player) { std::cout << "无正在播放" << std::endl; } void StopState::stop(MusicPlayer &player) { std::cout << "已经在停止状态了" << std::endl; }
int main() { MusicPlayer player;
player.setState(std::make_unique<PlayingState>());
player.pause(); player.pause(); player.play(); player.stop();
return 0; }
|