C++ 兩種設計模式:單例模式和觀察者監聽者模式
阿新 • • 發佈:2019-02-03
一、C++中有23種設計模式,大致分為建立型模式,結構型模式以及行為模式,
在這裡自己實現一下單例模式以及觀察者和監聽者模式
二、單例模式
我們通過維護一個static的成員變數來記錄唯一的物件例項,通過提供一個static的介面instance來獲得唯一的例項,就是一個簡單的類的實現
class singleton { public: static singleton instance() { if (mpsingleton == NULL) { mpsingleton = new singleton(); } return mpsingleton; } private: singleton(){} static singleton *mpsingleton; }; singleton::mpsingleton = NULL;
三、觀察者監聽者模式,建立一個一對多的依賴關係,重要的是mvc模式,逆置了事件的發生和事件的處理,同樣 因為是一對多的關係,所以在這個設計的過程中,採用繼承的方式,並且將基類宣告為抽象類,那何為抽象類呢,就是類中有純虛擬函式,好了不扯了 回到基類,大家也知道 基類指標可以指向派生類物件,另外在設計觀察者的時候,因為有可能一個監聽者對好幾件事情都感興趣,一件事又有好幾個監聽都感興趣,所以將觀察者的成員變數型別宣告為map<int,list<listeren*>> _obmap;也是用的現成的STL庫裡面的東西
程式碼如下:
class listener { public: listener(string name):_name(name){} virtual void handlmessage(int message) = 0; //純虛擬函式 擁有純虛擬函式的類成為抽象類 protected: string _name; }; class listener1 : public listener { listener1(string name):listener(name){} //從基類繼承成員變數 呼叫基類構造方法初始化該變數 void handlmessage(int msgid) { switch(msgid) { case 0:cout<<"0 interested!"<<endl; case 1:cout<<"1 interested!"<<endl; case 2:cout<<"2 interested!"<<endl; } } } class listener2 : public listener { listener2(string name):listener(name){} //從基類繼承成員變數 呼叫基類構造方法初始化該變數 void handlmessage(int msgid) { switch(msgid) { case 0:cout<<"0 interested!"<<endl; case 2:cout<<"2 interested!"<<endl; } } } class listener2 : public listener { listener2(string name):listener(name){} //從基類繼承成員變數 呼叫基類構造方法初始化該變數 void handlmessage(int msgid) { switch(msgid) { case 1:cout<<"1 interested!"<<endl; case 2:cout<<"2 interested!"<<endl; } } } class observe { public: void registerlistener(listener *p,int msgid) //基類指標指向派生類成員 正確 { _obmap[msgid]->push_back(p); } void displaymessage(int msgid) { map<int,list<listener*>>::iterator it = _obmap.find(msgid); if (it != _obmap.end()) { list<listener *>::iterator it1 = it->second->begin(); for (;it1 != it->second->end();it1++) { (*it1).handlmessage(msgid); } } } private: map<int,list<listener*>> _obmap; int msgid; };