State的用意在於,允許一個對象在其內部狀態改變時改變它的行爲;
State模擬Context的相關行爲接口, 針對具體的狀態, 利用虛函數的機制映射到相應的行爲, 從而避免大量的條件語句, 使得代碼更加清晰, 並且易於維護;當然這樣見帶來大量的子類, 維護這些類也是要代價的;
這裏我做了一個簡單的C++實現, 模擬門的打開關閉狀態, 和相關狀態下的行爲;這裏的Context狀態的變化我處理爲委託State改變, 仿照書本案例狀態類採用靜態的生成, 使得狀態對象成爲可以共享的輕量級行爲對象;
以下完整的源代碼示例, 水平有限, 不知理解正不正確;
#pragma warning(disable: 4530) #pragma warning(disable: 4786) #include #include using namespace std; class door_state ; class door_closed; class door_opened; class door { string _name; door_state * _state; friend class door_state; public: door(char *name) ; string & name(); void open(); void close(); void pass(); void report_state(); void change_state(door_state* new_state); } ; class door_state { public: virtual void open(door *) = 0; //這裏模擬door與狀態相關的行爲 virtual void close(door *) = 0; virtual void pass(door *) = 0; virtual void report_state(door *) = 0; }; class door_opened : public door_state { public: static door_state* instance() //產生一個全局實例, 這是個輕量級的行爲對象, 可以共享 { static door_opened g_obj; return &g_obj; } virtual void open(door *p) ; virtual void close(door *p) ; virtual void pass(door *); virtual void report_state(door *p); }; class door_closed : public door_state { public: static door_state* instance() { static door_closed g_obj; return &g_obj; } virtual void open(door *p); virtual void close(door *p); virtual void pass(door *); virtual void report_state(door *p); }; void door_opened::open(door *p) { cout << p->name().c_str() << " 已經是打開的" << endl; } void door_opened::close(door *p) { p->change_state(door_closed::instance()); cout << p->name().c_str() << " 關閉" << endl; } void door_opened::pass(door *p) { cout << "你可以通過 " << p->name().c_str() << endl; } void door_opened::report_state(door *p) { cout << p->name().c_str() << " 是打開的" << endl; } void door_closed::open(door *p) { p->change_state(door_opened::instance()); cout << p->name().c_str() << " 打開" << endl; } void door_closed::close(door *p) { cout << p->name().c_str() << " 已經是關閉的" << endl; } void door_closed::pass(door *p) { cout << "門已關閉,你不可以通過 " << p->name().c_str() << endl; } void door_closed::report_state(door *p) { cout << p->name().c_str() << " 是關閉的" << endl; } door::door(char *name) : _name(name) { change_state(door_closed::instance()); } string & door::name() { return _name; } void door::open() { _state->open(this); } void door::close() { _state->close(this); } void door::pass() { _state->pass(this); } void door::report_state() { _state->report_state(this); } void door::change_state(door_state* new_state) { _state = new_state; } int main(int argc, char *argv[]) { try { door d1("door 1#"); //這裏可以看到它們的行爲隨狀態而改變 door d2("door 2#"); //同時也可以看到2個對象共享同一個狀態對象 d1.report_state(); d1.open(); d2.open(); d1.close(); d1.close(); d1.report_state(); d2.report_state(); d1.pass(); d2.pass(); } catch(exception &e) { cout << e.what() << endl; } return 0; }