觀察者設計模式定義了對象間的一對多的依賴關係,一個對象的行爲依賴於另一個對象的狀態的情況下,當對象狀態發生變化時,依賴它的對象會得到通知並自動刷新。
觀察者模式中主要有兩種角色:觀察者和監聽者
觀察者主要是在事件到來時, 通知對於該事件感興趣的監聽者來處理事件。所以它的職責也就顯而易見了:①通知觀察者;②註冊事件。那麼監聽者當然就是來處理事件的了。
接下來通過代碼實現一個簡單的觀察者模式~
#include<iostream>
#include<string>
class Listerner //定義監聽者類
{
public:
Listerner(std::string name) :mname(name) {}
virtual void handleMessage(int message)const = 0;
protected:
std::string mname;
};
class Listerner1 : public Listerner //定義1號監聽者
{
public:
Listerner1(std::string name) :Listerner(name) {}
virtual void handleMessage(int message)const
{
switch (message)
{
case 1:
std::cout << mname << " has been solved message 1" << std::endl;
break;
case 2:
std::cout << mname << " has been solved message 2" << std::endl;
break;
default:
std::cout << mname << " no interested this message" << std::endl;
break;
}
}
};
class Listerner2 : public Listerner //定義2號監聽者
{
public:
Listerner2(std::string name) :Listerner(name) {}
virtual void handleMessage(int message)const
{
switch (message)
{
case 1:
std::cout << mname << " has been solved message 1" << std::endl;
break;
case 2:
std::cout << mname << " has been solved message 2" << std::endl;
break;
default:
std::cout << mname << " no interested this message" << std::endl;
break;
}
}
};
class Listerner3 : public Listerner //定義3號監聽者
{
public:
Listerner3(std::string name) :Listerner(name) {}
virtual void handleMessage(int message)const
{
switch (message)
{
case 1:
std::cout << mname << " has been solved message 1" << std::endl;
break;
case 2:
std::cout << mname << " has been solved message 2" << std::endl;
break;
default:
std::cout << mname << " no interested this message" << std::endl;
break;
}
}
};
#include<map>
#include<vector>
/*
multimap 一對多
map 一對一個集合
*/
class Obeserve //定義觀察者
{
public:
typedef std::map<int, std::vector<const Listerner*>> Mty;
typedef std::vector<const Listerner*> Vty;
void registerMessage(int message, const Listerner* pls)
{
Mty::iterator fit = mymap.find(message);
if (fit != mymap.end())
{
fit->second.push_back(pls);
}
else
{
Vty vec;
vec.push_back(pls);
mymap[message] = vec;
}
}
void notify(int message)
{
Mty::iterator fit = mymap.find(message);
if (fit != mymap.end())
{
Vty::iterator it = fit->second.begin();
while (it != fit->second.end())
{
(*it)->handleMessage(message);
it++;
}
}
}
private:
std::map<int, std::vector<const Listerner*>> mymap;
};
int main()
{
Listerner1 l1("listerner1");
Listerner2 l2("listerner2");
Listerner3 l3("listerner3");
Obeserve ob;
ob.registerMessage(1, &l1);
ob.registerMessage(2, &l1);
ob.registerMessage(2, &l2);
ob.registerMessage(3, &l2);
ob.registerMessage(1, &l3);
ob.registerMessage(3, &l3);
ob.notify(2);
return 0;
}
運行結果: