观察者模式学习
2016-06-04 10:08
246 查看
这是一篇学习博客,原文地址为:http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/observer.html,本文尊重原创,这是学习笔记,如有侵权,请立即联系删除。
观察者模式学习:
1.模式动机:
观察者模式建立了一种对象与对象之间的依赖关系,一个对象改变时自动通知其他对象,其他对象将相应做出反应,在此,发生改变的对象成为被观察目标,
被通知的对象称为观察者,一个被观察目标可以对应多个观察者,观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统易于扩展,这也是
观察者模式的模式动机。
2.模式定义
观察者模式又成为发布订阅模式
subject:目标
concreteSubject:具体目标
observer:观察者
concreteObserver:具体观察者
4.时序图:
时序图理解说明:创建好concreteObserver与concretesubject后,有一个重要的attach过程,然后当concretesubject重新设置状态时调用update通知concreteobserver,concreteobserver调用getstate获得状态改变信息。
5.示例代码与运行结果分析:
///////////////////////////////////////////////////////////
// Subject.h
// Implementation of the Class Subject
// Created on: 07-十月-2014 23:00:10
// Original author: cl
///////////////////////////////////////////////////////////
#if !defined(EA_61998456_1B61_49f4_B3EA_9D28EEBC9649__INCLUDED_)
#define EA_61998456_1B61_49f4_B3EA_9D28EEBC9649__INCLUDED_
#include "Obeserver.h"
#include <vector>
using namespace std;
class Subject
{
public:
Subject();
virtual ~Subject();
Obeserver *m_Obeserver;
void attach(Obeserver * pObeserver);
void detach(Obeserver * pObeserver);
void notify();
virtual int getState() = 0;
virtual void setState(int i)= 0;
private:
vector<Obeserver*> m_vtObj;
};
#endif // !defined(EA_61998456_1B61_49f4_B3EA_9D28EEBC9649__INCLUDED_)
///////////////////////////////////////////////////////////
// ConcreteObeserver.h
// Implementation of the Class ConcreteObeserver
// Created on: 07-十月-2014 23:00:09
// Original author: cl
///////////////////////////////////////////////////////////
#if !defined(EA_7B020534_BFEA_4c9e_8E4C_34DCE001E9B1__INCLUDED_)
#define EA_7B020534_BFEA_4c9e_8E4C_34DCE001E9B1__INCLUDED_
#include "Obeserver.h"
#include <string>
using namespace std;
class ConcreteObeserver : public Obeserver
{
public:
ConcreteObeserver(string name);
virtual ~ConcreteObeserver();
virtual void update(Subject * sub);
private:
string m_objName;
int m_obeserverState;
};
#endif // !defined(EA_7B020534_BFEA_4c9e_8E4C_34DCE001E9B1__INCLUDED_)
///////////////////////////////////////////////////////////
// ConcreteObeserver.cpp
// Implementation of the Class ConcreteObeserver
// Created on: 07-十月-2014 23:00:09
// Original author: cl
///////////////////////////////////////////////////////////
#include "ConcreteObeserver.h"
#include <iostream>
#include <vector>
#include "Subject.h"
using namespace std;
ConcreteObeserver::ConcreteObeserver(string name){
m_objName = name;
}
ConcreteObeserver::~ConcreteObeserver(){
}
void ConcreteObeserver::update(Subject * sub){
m_obeserverState = sub->getState();
cout << "update oberserver[" << m_objName << "] state:" << m_obeserverState << endl;
}
观察者模式学习:
1.模式动机:
观察者模式建立了一种对象与对象之间的依赖关系,一个对象改变时自动通知其他对象,其他对象将相应做出反应,在此,发生改变的对象成为被观察目标,
被通知的对象称为观察者,一个被观察目标可以对应多个观察者,观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统易于扩展,这也是
观察者模式的模式动机。
2.模式定义
观察者模式又成为发布订阅模式
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">3.模式结构:</span>
subject:目标
concreteSubject:具体目标
observer:观察者
concreteObserver:具体观察者
4.时序图:
时序图理解说明:创建好concreteObserver与concretesubject后,有一个重要的attach过程,然后当concretesubject重新设置状态时调用update通知concreteobserver,concreteobserver调用getstate获得状态改变信息。
5.示例代码与运行结果分析:
#include <iostream> #include "Subject.h" #include "Obeserver.h" #include "ConcreteObeserver.h" #include "ConcreteSubject.h" using namespace std; int main(int argc, char *argv[]) { Subject * subject = new ConcreteSubject(); Obeserver * objA = new ConcreteObeserver("A"); Obeserver * objB = new ConcreteObeserver("B"); subject->attach(objA); subject->attach(objB); subject->setState(1); subject->notify(); cout << "--------------------" << endl; subject->detach(objB); subject->setState(2); subject->notify(); delete subject; delete objA; delete objB; return 0; }
///////////////////////////////////////////////////////////
// Subject.h
// Implementation of the Class Subject
// Created on: 07-十月-2014 23:00:10
// Original author: cl
///////////////////////////////////////////////////////////
#if !defined(EA_61998456_1B61_49f4_B3EA_9D28EEBC9649__INCLUDED_)
#define EA_61998456_1B61_49f4_B3EA_9D28EEBC9649__INCLUDED_
#include "Obeserver.h"
#include <vector>
using namespace std;
class Subject
{
public:
Subject();
virtual ~Subject();
Obeserver *m_Obeserver;
void attach(Obeserver * pObeserver);
void detach(Obeserver * pObeserver);
void notify();
virtual int getState() = 0;
virtual void setState(int i)= 0;
private:
vector<Obeserver*> m_vtObj;
};
#endif // !defined(EA_61998456_1B61_49f4_B3EA_9D28EEBC9649__INCLUDED_)
/////////////////////////////////////////////////////////// // Subject.cpp // Implementation of the Class Subject // Created on: 07-十月-2014 23:00:10 // Original author: cl /////////////////////// 4000 //////////////////////////////////// #include "Subject.h" Subject::Subject(){ } Subject::~Subject(){ } void Subject::attach(Obeserver * pObeserver){ m_vtObj.push_back(pObeserver); } void Subject::detach(Obeserver * pObeserver){ for(vector<Obeserver*>::iterator itr = m_vtObj.begin(); itr != m_vtObj.end(); itr++) { if(*itr == pObeserver) { m_vtObj.erase(itr); return; } } } void Subject::notify(){ for(vector<Obeserver*>::iterator itr = m_vtObj.begin(); itr != m_vtObj.end(); itr++) { (*itr)->update(this); } }
/////////////////////////////////////////////////////////// // Obeserver.h // Implementation of the Class Obeserver // Created on: 07-十月-2014 23:00:10 // Original author: cl /////////////////////////////////////////////////////////// #if !defined(EA_2C7362B2_0B22_4168_8690_F9C7B76C343F__INCLUDED_) #define EA_2C7362B2_0B22_4168_8690_F9C7B76C343F__INCLUDED_ class Subject; class Obeserver { public: Obeserver(); virtual ~Obeserver(); virtual void update(Subject * sub) = 0; }; #endif // !defined(EA_2C7362B2_0B22_4168_8690_F9C7B76C343F__INCLUDED_)
///////////////////////////////////////////////////////////
// ConcreteObeserver.h
// Implementation of the Class ConcreteObeserver
// Created on: 07-十月-2014 23:00:09
// Original author: cl
///////////////////////////////////////////////////////////
#if !defined(EA_7B020534_BFEA_4c9e_8E4C_34DCE001E9B1__INCLUDED_)
#define EA_7B020534_BFEA_4c9e_8E4C_34DCE001E9B1__INCLUDED_
#include "Obeserver.h"
#include <string>
using namespace std;
class ConcreteObeserver : public Obeserver
{
public:
ConcreteObeserver(string name);
virtual ~ConcreteObeserver();
virtual void update(Subject * sub);
private:
string m_objName;
int m_obeserverState;
};
#endif // !defined(EA_7B020534_BFEA_4c9e_8E4C_34DCE001E9B1__INCLUDED_)
///////////////////////////////////////////////////////////
// ConcreteObeserver.cpp
// Implementation of the Class ConcreteObeserver
// Created on: 07-十月-2014 23:00:09
// Original author: cl
///////////////////////////////////////////////////////////
#include "ConcreteObeserver.h"
#include <iostream>
#include <vector>
#include "Subject.h"
using namespace std;
ConcreteObeserver::ConcreteObeserver(string name){
m_objName = name;
}
ConcreteObeserver::~ConcreteObeserver(){
}
void ConcreteObeserver::update(Subject * sub){
m_obeserverState = sub->getState();
cout << "update oberserver[" << m_objName << "] state:" << m_obeserverState << endl;
}
相关文章推荐
- pip更新问题
- OpenCV 配置
- 第十五周实践项目阅读程序————5
- 如何设置CDM启动后的默认路径
- LeetCode Top K Frequent Elements
- HDU 1241 Oil Deposits (基础DFS 或者 BFS)
- R可视化绘图二-ggplot2
- 第十五周 阅读程序(5)
- android studio 64位手机+Fresco引起的在arm64位机器上找不到对应的so库
- 移动端无限滚动加载 js实现原理
- poj 1236 Network of Schools 强连通分量
- memcached和redis
- Glide图片缓存框架
- R可视化绘图一ggplot2之qplot
- Linux find exec 记录
- 华为机试---字符串匹配
- Android View 深度分析requestLayout、invalidate与postInvalidate
- linux命令笔记(随时更新)
- 设计模式—装饰模式
- Gcc在Windows下编写C语言