简介
指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
代码
#include<iostream>
using namespace std;
#include<list>
class observe
{
public:
observe(){}
virtual void updata(){}
};
class subject
{
public:
void attach(observe *ob)
{
m_lst.push_back(ob);
}
void detach(observe *ob)
{
auto ite = m_lst.begin();
while(ite!=m_lst.end())
{
if(*ite==ob)
{
delete *ite;
break;
}
++ite;
}
}
void notice()
{
auto ite = m_lst.begin();
while(ite!=m_lst.end())
{
(*ite)->updata();
++ite;
}
}
virtual string getstate()
{
return state;
}
virtual void setstate(string str){}
public:
list<observe*> m_lst;
public:
string state;
};
class Secretary:public subject
{
public:
string getstate()
{
return this->state;
}
void setstate(string str)
{
this->state = str;
}
};
class Stock:public observe
{
public:
Stock(string str,subject *sub)
{
s_name = str;
s_sub = sub;
}
void updata()
{
cout<<s_name.c_str()<<"----"<<s_sub->getstate().c_str()<<"关闭股票,开始工作"<<endl;
}
public:
string s_name;
subject *s_sub;
};
class NBA:public observe
{
public:
NBA(string str,subject *sub)
{
s_name = str;
s_sub = sub;
}
void updata()
{
cout<<s_name.c_str()<<"----"<<s_sub->getstate().c_str()<<"关闭NBA,开始工作"<<endl;
}
public:
string s_name;
subject *s_sub;
};
int main()
{
subject *sub = new Secretary();
string stock1 = "看股票的人";
string nba1 = "看nba的人";
observe *stock = new Stock(stock1,sub);
observe *nba = new NBA(nba1,sub);
sub->attach(stock);
sub->attach(nba);
sub->setstate("老板回来了");
sub->notice();
stock->updata();
nba->updata();
system("pause");
return 0;
}
优点
1、观察者和被观察者是抽象耦合的。
2、建立一套触发机制。
缺点
1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。