1. 程式人生 > >C++ 兩種設計模式:單例模式和觀察者監聽者模式

C++ 兩種設計模式:單例模式和觀察者監聽者模式

一、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;
};