观察者设计模式定义了对象间的一对多的依赖关系,一个对象的行为依赖于另一个对象的状态的情况下,当对象状态发生变化时,依赖它的对象会得到通知并自动刷新。
观察者模式中主要有两种角色:观察者和监听者
观察者主要是在事件到来时, 通知对于该事件感兴趣的监听者来处理事件。所以它的职责也就显而易见了:①通知观察者;②注册事件。那么监听者当然就是来处理事件的了。
接下来通过代码实现一个简单的观察者模式~
#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;
}
运行结果: