意图
当一个对象的内部状态改变时,改变其行为。
适用于对象的行为由它的状态决定时,或是一个方法中有多个分支,这些分支都依赖于对象的状态。
示例
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
| class ServerState { public: virtual void connect() = 0; };
class Established : public ServerState { public: ~Established() = default; static Established& instance() { static Established instance; return instance; }
void connect() override { cout << "connection is established.\n"; }
private: Established() = default; };
class Listening : public ServerState { public: ~Listening() = default; static Listening& instance() { static Listening instance; return instance; }
void connect() override { cout << "connection is listening.\n"; }
private: Listening() = default; };
class Closed : public ServerState { public: ~Closed() = default; static Closed& instance() { static Closed instance; return instance; }
void connect() override { cout << "connection is closed.\n"; }
private: Closed() = default; };
class Server { public:
public: Server() : m_state(&Closed::instance()) { }
void changeState(ServerState* s) { m_state = s; }
void connect() { m_state->connect(); }
private: ServerState* m_state; };
int main() { Server s; s.connect();
s.changeState(&Listening::instance()); s.connect();
s.changeState(&Closed::instance()); s.connect();
return 0; }
|
例如,一个服务器可能有正在监听、已建立连接、服务关闭等状态,当调用连接时,每种状态都会有不同的表示,我们分别使用单例类来表现。当切换状态后,服务被调用同样的连接方法,可以得到不同的结果:
1 2 3
| connection is closed. connection is listening. connection is closed.
|