最近学了软件工程技术与应用案例这门课程,我对设计模式中的观察者模式的介绍,写一篇博客记录一下吧。
观察者模式的定义
观察者模式属于行为型模式,当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。
观察者模式的应用场景
1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
例子:建立一个天气实时更新的应用,有三种布告板,分别显示目前的状况、天气统计及简单的预报。当天气数据发生变化时,三种布告板必须实时更新。
优缺点
优点:
1、观察者和被观察者是抽象耦合的。比如我想添加一个观察者,只需要往被观察者的观察者向量里面push一个观察者就行了。
2、建立一套触发机制。被观察者的成员变量的值改变的时候,观察者实时自动跟新,能应用于很多场景下。
缺点:
1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
cpp代码
#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
class Observer{
public:
virtual void updata() = 0;
};
class Subject
{
public:
int getState() {
return state;
}
void setState(int state) {
this->state = state;
NotifyAllObservers();
}
void Attach(Observer* observer) {
observers.push_back(observer);
}
void NotifyAllObservers() {
for (Observer* observer : observers) {
observer->updata();
}
}
private:
int state;
vector<Observer*> observers;
};
class BinaryObserver :public Observer {
public:
BinaryObserver(Subject* subject) {
this->subject = subject;
this->subject->Attach(this);
}
void updata() {
char* str = new char[25];
_itoa(subject->getState(), str, 2);
cout << "Binary String:" << str << endl;
delete[] str;
}
private:
Subject* subject;
};
class OctalObserver:public Observer {
public:
OctalObserver(Subject* subject) {
this->subject = subject;
this->subject->Attach(this);
}
void updata() {
cout << "Octal String:" << subject->getState() << endl;
}
private:
Subject* subject;
};
class HexaObserver :public Observer {
public:
HexaObserver(Subject* subject) {
this->subject = subject;
this->subject->Attach(this);
}
void updata() {
char* str = new char[25];
_itoa(subject->getState(), str, 16);
cout << "hex String:" << str << endl;
delete[] str;
}
private:
Subject* subject;
};
int main()
{
std::cout << "Hello 观察者模式!\n";
Subject* subject = new Subject();
BinaryObserver* bino = new BinaryObserver(subject);
OctalObserver* ctao = new OctalObserver(subject);
HexaObserver* hexo = new HexaObserver(subject);
cout << "第一次状态改变:15" << endl;
subject->setState(15);
cout << "第二次状态改变:10" << endl;
subject->setState(10);
delete bino;
delete ctao;
delete hexo;
return 0;
}