基于C++实现观察者模式

目录

1.观察者模式

2.看看代码吧


1.观察者模式

观察者模式:定义一种 一(被观察)对多 (观察)的关系。在被观察类发生某种事件时,观察类需要做出反应。

实现方式:

在被观察者类里定义一个表示状态的变量,然后在观察者类里存放一个被观察者类对象,通过被观察者类对象获取状态。同时,被观察者类使用vector/list .... 来管理观察者。


2.看看代码吧

cpp 复制代码
#include <iostream>
#include <string>
#include <list>

using namespace std;

//观察者类
class Observer {
public:
	Observer() {}
	virtual ~Observer() {}
	virtual void update() {}
};


class SubObject
{
public:
	string _action; //设置状态
	SubObject() {}
	virtual ~SubObject() {}

	//添加观察者
	void attach(Observer* ob)
	{
		ls.push_back(ob);
	}
	//去除观察者
	void detach(Observer* ob)
	{
		ls.remove(ob);
	}
	//通知
	void notify()
	{
		for (auto e : ls)
		{
			e->update();
		}
	}

	//设置状态
	virtual void SetAction(string action) {
		_action = action;
	}
	//返回状态
	virtual string GetAction() {
		return _action;
	}
protected:
	list<Observer*> ls;
};

class BossObject : public SubObject
{
public:
	BossObject()		
	{}
	void SetAction(string action) {
		_action = action;
	}
	string GetAction() {
		return _action;
	}
};

class SleepObserver : public Observer
{
public:
	SleepObserver(string name, SubObject* sub)
		:_sub(sub), _name(name)
	{}

	void update()
	{
		string action = _sub->GetAction();
		cout << "我是观察者: " << _name << endl;
		cout << "老板说:" << action << endl;

		if (action == "sleep")
			cout << "我要睡大觉咯" << endl;
	}

private:
	SubObject* _sub;
	string _name;
};

class WorkObserver : public Observer
{
public:
	WorkObserver(string name, SubObject* sub)
		:_sub(sub), _name(name)
	{}

	void update()
	{
		string action = _sub->GetAction();
		cout << "我是观察者: " << _name << endl;
		cout << "老板说:" << action << endl;

		if (action == "work")
			cout << "我要努力加班,努力搞$" << endl;
	}

private:
	SubObject* _sub;
	string _name;
};

int main()
{
	SubObject* Boss = new BossObject();
	SleepObserver* ob1 = new SleepObserver("sleepob", Boss);
	WorkObserver* ob2 = new WorkObserver("workob", Boss);

	Boss->attach(ob1);
	Boss->attach(ob2);

	Boss->SetAction("work");
	Boss->notify();
	cout << endl;

	Boss->SetAction("sleep");
	Boss->notify();
	cout << endl;

	return 0;
}

结果图:

相关推荐
饕餮争锋4 天前
设计模式笔记_行为型_观察者模式
笔记·观察者模式·设计模式
melonbo4 天前
中介者模式和观察者模式的区别是什么
观察者模式·中介者模式
源代码•宸8 天前
深入浅出设计模式——行为型模式之观察者模式 Observer
开发语言·c++·经验分享·观察者模式·设计模式·raii
金宗汉16 天前
文明存续的时间博弈:论地球资源枯竭临界期的技术突围与行动紧迫性
大数据·人工智能·笔记·算法·观察者模式
醉酒的李白、25 天前
C#观察者模式示例代码
观察者模式·c#
天天进步201525 天前
设计模式在Java中的实际应用:单例、工厂与观察者模式详解
java·观察者模式·设计模式
Dxy12393102161 个月前
Python观察者模式详解:从理论到实战
开发语言·python·观察者模式
极光雨雨1 个月前
【设计模式】观察者模式 (发布-订阅模式,模型-视图模式,源-监听器模式,从属者模式)
观察者模式·设计模式
C雨后彩虹1 个月前
行为模式-状态模式
java·观察者模式·设计模式
C雨后彩虹1 个月前
行为模式-观察者模式
java·观察者模式·设计模式