微信版本的wordpress,seo学校培训课程,页游网站,打开网站搜索定义
定义对象间的一种一对多(变化)的依赖关系#xff0c;以便当一个对象(Subject)的状态发生改变时#xff0c;所有依赖于它的对象都得到通知并自动更新。 ——《设计模式》GoF
使用场景
一个对象#xff08;目标对象#xff09;的状态发生改变#xff0c;所有的依赖对…定义
定义对象间的一种一对多(变化)的依赖关系以便当一个对象(Subject)的状态发生改变时所有依赖于它的对象都得到通知并自动更新。 ——《设计模式》GoF
使用场景
一个对象目标对象的状态发生改变所有的依赖对象观察者对象都将得到通知进行广播通知。
结构 代码示例
//Observer.h
/****************************************************/
#ifndef OBSERVER_H
#define OBSERVER_H
#includeiostream
#includelist
using namespace std;class Observer {
public://构造Observer(){ }//析构virtual ~Observer(){ }//更新virtual void updata(){ }
};class Server {
private://观察者链表listObserver* m_Observer;protected://服务器状态string m_Status;public://构造函数Server(){ }//析构函数virtual ~Server(){ }//添加观察者void Attach(Observer* observer) {this-m_Observer.push_back(observer);}//移除观察者void Remove(Observer* observer) {this-m_Observer.remove(observer);}//设置服务器状态virtual void SetStatus(string s){ }//获取服务器状态virtual string GetStatus() {return this-m_Status;}//通知观察者void Notify() {for (listObserver*::iterator iter this-m_Observer.begin();iter ! m_Observer.end(); iter) {(*iter)-updata();}}
};//具体服务器
class Concrete_Server : public Server {
private://用户名称string m_Name;
public://构造Concrete_Server(string name) {this-m_Name name;}//析构~Concrete_Server(){ }//设置服务器状态virtual void SetStatus(string s) { this-m_Status (this-m_Name)s;}//获取服务器状态virtual string GetStatus() {return this-m_Status;}
};//具体观察者
class Concrete_Observer : public Observer {
private://观察者名称string m_Name;//需要观察的服务器Server* m_Server;
public://构造Concrete_Observer(string name, Server* server) {this-m_Name name;this-m_Server server;}//析构~Concrete_Observer(){ }//更新virtual void updata() {cout this-m_Name : this-m_Server-GetStatus() endl;}
};#endif
//test.cpp
/****************************************************/
#include iostream
#include string
#include Observer.hint main()
{Server* server1 new Concrete_Server(服务器1);Observer* observer1 new Concrete_Observer(观察者1, server1);Observer* observer2 new Concrete_Observer(观察者2, server1);server1-Attach(observer1);server1-Attach(observer2);server1-SetStatus(2.1.0.001更新系统);server1-Notify();delete server1;server1 NULL;delete observer1;observer1 NULL;return 0;
}运行结果
要点总结
使用面向对象的抽象Observer模式使得我们可以独立地改变目标与观察者从而使二者之间的依赖关系达致松耦合。目标发送通知时,无需指定观察者通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知目标对象对此一无所知。Observer模式是基于事件的UI框架中非常常用的设计模式也是MVC模式的一个重要组成部分。