观察者模式

来源:互联网 发布:腰带软件 过安检 编辑:程序博客网 时间:2024/05/17 03:45

观察者模式是一种行为模式。定义了对象间的一种一对多的关系,当一个对象发生变化的时,所有依赖它的对象都将被通知并更新。

观察者模式一般会包含观察者和被观察者,它完美的将观察者和被观察者分开。各自只注重各自的功能,这个也是符合面向对象的设计原则的(单一职责)。

“观察“不是直接调用。观察者与被观察者之间存在互动关系,不能设计直接的互相调用,这样会存在强耦合,不符合面向对象的设计原则(依赖倒转),互动应该依赖于接口或者抽象。我们在c++中使用抽象类来实现。

比较典型的一种实现方法是:“注册--通知--撤销注册“的方式。

#include <iostream>#include <list>using namespace std;class blog;class observer{public:virtual void Update() = 0;};class ConcreteObserver1: public observer{public:ConcreteObserver1(string s, blog *b):m_name(s), mp_blog(b) {}void Update();private:blog *mp_blog;string m_name;};class ConcreteObserver2: public observer{public:ConcreteObserver2(string s, blog *b):m_name(s), mp_blog(b) {}void Update();private:blog *mp_blog;string m_name;};class ConcreteObserver3: public observer{public:ConcreteObserver3(string s, blog *b):m_name(s), mp_blog(b) {}void Update();private:blog *mp_blog;string m_name;};class blog{private:list<observer *> ml_observer;public:void Attach(observer *obs) {ml_observer.push_back(obs);}void detach(observer *obs) {ml_observer.remove(obs);}void Notify(){list<observer*>::iterator iter = ml_observer.begin();           for(; iter != ml_observer.end(); iter++)              (*iter)->Update();  }virtual void SetState(string s) = 0;virtual void GetState() = 0;//protected:string m_state;};class ConcreteBlog: public blog{public:ConcreteBlog(string s):m_name(s) {}void SetState(string s) { m_state = "blog state set" + s;}void GetState() {};private:string m_name;};void ConcreteObserver1::Update(){ mp_blog->GetState();cout<< mp_blog->m_state << m_name << "1已更新" << endl;}void ConcreteObserver2::Update(){ mp_blog->GetState();cout<< mp_blog->m_state << m_name << "2已更新" << endl;}void ConcreteObserver3::Update(){ mp_blog->GetState();cout<< mp_blog->m_state << m_name << "3已更新" << endl;}int main(){ConcreteBlog Cb("cb");ConcreteObserver1 Co1("co1", &Cb);ConcreteObserver2 Co2("co2", &Cb);ConcreteObserver3 Co3("co3", &Cb);Cb.Attach(&Co1);Cb.Attach(&Co2);Cb.Attach(&Co3);Cb.SetState("changers");Cb.Notify();return 0;}


原创粉丝点击