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;
}
相关推荐
presenttttt9 分钟前
用Python和OpenCV从零搭建一个完整的双目视觉系统(四)
开发语言·python·opencv·计算机视觉
每日出拳老爷子15 分钟前
[C#] 使用TextBox换行失败的原因与解决方案:换用RichTextBox的实战经验
开发语言·c#
半桔18 分钟前
【Linux手册】从接口到管理:Linux文件系统的核心操作指南
android·java·linux·开发语言·面试·系统架构
闻缺陷则喜何志丹19 分钟前
【前缀和 BFS 并集查找】P3127 [USACO15OPEN] Trapped in the Haybales G|省选-
数据结构·c++·前缀和·宽度优先·洛谷·并集查找
nightunderblackcat27 分钟前
新手向:实现ATM模拟系统
java·开发语言·spring boot·spring cloud·tomcat·maven·intellij-idea
开开心心就好30 分钟前
电脑息屏工具,一键黑屏超方便
开发语言·javascript·电脑·scala·erlang·perl
笑衬人心。37 分钟前
Java 17 新特性笔记
java·开发语言·笔记
序属秋秋秋2 小时前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习
ruan1145143 小时前
MySQL4种隔离级别
java·开发语言·mysql
quant_19864 小时前
R语言如何接入实时行情接口
开发语言·经验分享·笔记·python·websocket·金融·r语言