观察者模式(C++)

定义

定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。

------《设计模式》GoF

使用场景

一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

结构

代码示例

cpp 复制代码
//Observer.h
/****************************************************/
#ifndef OBSERVER_H
#define OBSERVER_H
#include<iostream>
#include<list> 
using namespace std;
 
class Observer {
public:
	//构造
	Observer(){ }
	//析构
	virtual ~Observer(){ }
	//更新
	virtual void updata(){ }
};
 
class Server {
private:
	//观察者链表
	list<Observer*> 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 (list<Observer*>::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
cpp 复制代码
//test.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Observer.h"
 
 
int 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模式的一个重要组成部分。
相关推荐
t***5446 小时前
Clang 编译器在 Orwell Dev-C++ 中的局限性
开发语言·c++
yolo_guo7 小时前
redis++使用: hmset 与 hmget
c++·redis
handler018 小时前
拒绝权限报错!三分钟掌握 Linux 权限管理
linux·c语言·c++·笔记·学习
t***5449 小时前
如何在Dev-C++中选择Clang编译器
开发语言·c++
汉克老师9 小时前
GESP2023年9月认证C++三级( 第一部分选择题(9-15))
c++·gesp三级·gesp3级
Wave84512 小时前
C++继承详解
开发语言·c++·算法
Tairitsu_H12 小时前
C++类基础概念:定义、实例化和this指针
开发语言·c++
不想写代码的星星12 小时前
C++17 string_view 观察报告:好用,但有点费命
c++
努力努力再努力wz13 小时前
【Linux网络系列】深入理解 I/O 多路复用:从 select 痛点到 poll 高并发服务器落地,基于 Poll、智能指针与非阻塞 I/O与线程池手写一个高性能 HTTP 服务器!(附源码)
java·linux·运维·服务器·c语言·c++·python
努力努力再努力wz13 小时前
【Linux网络系列】万字硬核解析网络层核心:IP协议到IP 分片重组、NAT技术及 RIP/OSPF 动态路由全景
java·linux·运维·服务器·数据结构·c++·python