观察者模式:
定义对象间的一种一对多的依赖关系,将对象分为观察者与被观察者,当被观察者的状态发生改变时。观察者会及时的收到通知并且及时的进行数据更新,当被观察者发生改变时,所有关注它的观察者都会得到通知。
它还有两个别名,依赖(Dependents),发布-订阅(Publish-Subsrcibe)。举个博客订阅的例子,当博主发表新文章的时候,即博主状态发生了改变,那些订阅的读者就会收到通知,然后进行相应的动作,比如去看文章,或者收藏起来。博主(被观察者)与读者(观察者)之间存在种一对多的依赖关系。
//观察者
class Observer
{
public:
Observer()
{
}
virtual ~Observer()
{
}
virtual void Update()
{
}
};
// 被观察者
class Blog
{
private:
list<Observer*>m_observers; //观察者链表
public:
string m_status; //被观察者状态
public:
Blog()
{
}
virtual~Blog()
{
}
void Attach(Observer* observer) //添加观察者
{
m_observers.push_back(observer);
}
void Remove(Observer* observer) //移除观察者 (屏蔽,不让他看)
{
m_observers.remove(observer);
}
void Notify()//通知观察者
{
list<Observer*>::iterator ite = m_observers.begin();
while(ite!=m_observers.end()){
(*ite)->Update(); //观察者更新状态
ite++;
}
}
virtual void SetStatus(string s) //设置被观察者状态
{
m_status = s;
}
virtual string GetStatus() //获得被观察者状态
{
return m_status;
}
};
//以上是观察者和博客(被观察者)的基类,博客类主要完成观察者的添加,移除,通知操作,
//设置和获得状态是一个虚函数,具体需要在子类里实现
//具体的博客类
class BlogCSDN:public Blog
{
private:
string m_name;
public:
BlogCSDN(string name)
{
m_name = name;
}
~BlogCSDN()
{
}
void SetStatus(string s)
{
m_status = "CSDN 通知:" + m_name + s; //设置具体状态
}
string GetStatus()
{
return m_status;
}
};
//具体的观察者
class ObserverBlog:public Observer
{
private:
string m_name; //观察者名称
Blog *m_blog; //观察哪个博客(也可以链表的形式 观察多个博客)
public:
ObserverBlog(string name,Blog *blog)
{
m_name = name;
m_blog = blog;
}
~ObserverBlog()
{
}
void Update() //更新状态
{
string status = m_blog->GetStatus();
cout<<m_name<<"-----"<<status<<endl;
}
};
int main()
{
Blog *p = new BlogCSDN("鸟鸟Wink");
Observer* Observer1 = new ObserverBlog("1号观察者",p);
Observer* Observer2 = new ObserverBlog("2号观察者",p);
p->Attach(Observer1);
p->Attach(Observer2);
p->SetStatus("正在更新有关设计模式的博客。");
p->Notify();
p->Remove(Observer1);
p->SetStatus("正在更新有关算法的博客。");
p->Notify();
delete p;
delete Observer1;
delete Observer2;
return 0;
}
部分内容参考于:https://blog.csdn.net/wuzhekai1985/article/details/6674984