观察者模式
来源:互联网 发布:腰带软件 过安检 编辑:程序博客网 时间: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;}
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 一次IBM 服务器的磁盘故障更换过程
- oracle之隐式游标和ref游标总结
- linux 2.6.x Makefile
- 索引和长度必须引用该字符串内的位置。参数名: length
- linux系统性能调优第一步——性能分析(vmstat)
- 观察者模式
- dataguard
- 突然有爆粗口的冲动!!!
- IP-二进制数分析
- 苹果发布Safari5.1.2,改进记忆功能并增强稳定性
- NDK是什么?(What is the NDK?)
- 使用Postgresql基因查询优化
- 如何在ashx页面获取Session值(未将对象引用设置到对象的实例)
- could not get next sequence value