观察者模式

来源:互联网 发布:图片裁剪软件 编辑:程序博客网 时间:2024/06/06 08:33

一、定义:观察者模式定义了对象之间一对多的依赖,这样一来,当一个对象发生改变时,它的所有依赖就会收到通知发生改变。

二、类图



        


三、代码

#include<iostream>
#include<list>
using std::list;
using namespace std;
//观察者
class Observer
{
public:
Observer() {}
virtual ~Observer() {}
virtual void Update() {}
};
//博客
class Blog
{
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 iter = m_observers.begin();
for(; iter != m_observers.end(); iter++)
(*iter)->Update();
}
virtual void SetStatus(string s) { m_status = s; } //设置状态
virtual string GetStatus() { return m_status; }    //获得状态
private:
list<Observer* > m_observers; //观察者链表
protected:
string 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 *blog = new BlogCSDN("langrun");
Observer *observer1 = new ObserverBlog("tutupig", blog);
blog->Attach(observer1);
blog->SetStatus("观察者模式");
blog->Notify();
delete blog;
delete observer1;
return 0;
}

0 0