c++实现观察者模式

前言

我觉得这是最有意思的模式,其中一个动,另外的自动跟着动。发布-订阅,我觉得很巧妙。

代码

头文件

cpp 复制代码
#pragma once
#include<vector>
#include<string>
#include<iostream>

// 抽象观察者
class Aobserver
{
public:
	virtual void update(std::string& updated_state) = 0;
};


// 抽象通知者
class Asubject
{
protected:
	std::vector<Aobserver*> _pObservers;

	bool whetherRegist(Aobserver* p_observer)
	{
		for (auto it : _pObservers) {
			if (it == p_observer) return true;
		}
		return false;
	}

public:
	virtual void registObserver(Aobserver* p_observer) = 0;
	virtual void detachObserver(Aobserver* p_observer) = 0;
	virtual void notify(const std::string& teacher_name) = 0;

};


// 具体通知者
class Csubject1 : public Asubject
{
private:
	std::string _subjectName;

public:
	Csubject1(const std::string& subject_name) :_subjectName(subject_name) {}

	// 注册观察者
	void registObserver(Aobserver* p_observer) override
	{
		if (p_observer!=nullptr && whetherRegist(p_observer) == false) {
			_pObservers.push_back(p_observer);
		}
	}

	void detachObserver(Aobserver* p_observer) override
	{
		if (p_observer != nullptr)
		{
			for (auto it : _pObservers) {
				if (it == p_observer) {
					_pObservers.erase(
						std::remove(_pObservers.begin(),_pObservers.end(),it),
						_pObservers.end());
				}
			}
		}
	}

	void notify(const std::string& teacher_name) override
	{
		std::string notify_state = _subjectName + " say: "+ teacher_name +" is coming!";
		for (auto it : _pObservers) {
			it->update(notify_state);
		}
	}
};

// 具体观察者
class Hablee : public Aobserver
{
private:
	void cancleReading(std::string& updated_state)
	{
		std::cout << updated_state;
		std::cout << " you should stop reading" << std::endl;
	}

public:
	void update(std::string& updated_state) override
	{
		this->cancleReading(updated_state);
	}

};

class Yuki : public Aobserver
{
private:
	void canclePlayingGuitar(std::string& updated_state)
	{
		std::cout << updated_state;
		std::cout << " you should stop plaing guitar" << std::endl;
	}

public:
	void update(std::string& updated_state) override
	{
		this->canclePlayingGuitar(updated_state);
	}
};

main.cpp

cpp 复制代码
#include<iostream>
#include"Aobserver.h"


int main()
{
	Csubject1 wzq("wangZhaoQi"); // 通知者
	
	Hablee lhb;	
	wzq.registObserver(&lhb);

	Yuki wwy;
	wzq.registObserver(&wwy);

	wzq.notify("lyj");
	wzq.notify("xiaoZhang");

	wzq.detachObserver(&lhb);
	wzq.notify("lyj");
	
	return 0;
}
相关推荐
冯汉栩13 分钟前
Swift Control RollingCountdownView(动画倒计时)
开发语言·ios·swift
lisanmengmeng16 分钟前
搭建elk环境并接入frostmourne,实现监控报警效果(五)
开发语言·elk·日志·日志监控
oh,huoyuyan1 小时前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
风流 少年1 小时前
hutool
java·服务器·开发语言
一木 之林2 小时前
四、STL容器与数据结构
开发语言·数据结构·c++
QX_hao2 小时前
【Go】--Cobra-cli的用法
开发语言·后端·golang
程与留2 小时前
07_QMainWindow 与应用程序框架——菜单栏、工具栏、状态栏
c++·qt
艾醒(AiXing-w)2 小时前
LangChain 1.0 入门(三):稳定性双核心——重试机制+速率限速器参数详解与实战
开发语言·langchain·php
总有刁民想爱朕ha3 小时前
Python PyQt5图片批量转MP4视频工具:本地离线免费无水印,完整代码
开发语言·python·qt
宸津-代码粉碎机3 小时前
FastUtil+AI多Agent实战:Java AI项目性能终极加速方案
java·服务器·开发语言·python·安全·php