观察者设计模式c++实现

观察者设计模式:

行为型设计模式 主要是定义了一个状态发生改变后会去影响的对象 比起我们手动的去遍历所有对象然后去判断要快的多 也叫订阅发布者设计模式 也可以订阅我敢兴趣的消息 当我感兴趣的消息发生时 我将自动收到消息并处理

观察者模式是一种对象行为型模式,其主要优点如下: - 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。 - 目标与观察者之间建立了一套触发机制。

它的主要缺点如下: - 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。 - 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

uml图如下:

我这里只具现化了一个具体观察者类 其实可以有很多具体观察者类和被观察者类 具体就可以自己添加啦 我这里只实现最主要的骨架

//观察者设计模式
//当一个事情发生的时候 或者说当一个物体的状态发生改变的时候 我们总是希望改变与之相关的物体的状态
//也就是说我们具体对象希望关注到某一个状态的改变 这个时候通常的做法有两种
//第一种 当状态发生改变的时候 我们去遍历所有对象 找到希望关注该状态发生改变的对象
//第二种 新引入一个类 该类作为状态的发起者 其他人作为观察者 由他来通知所有对象
//明显 第二种方法和模式更加值得我们去使用 无论是性能还是代码可读性都更强
//我们构造如下一种场景有一个动物园 他有不同的园区 当某一个园区闭园时我们希望让该园区的所有人员退场
#include<list>
#include<string>
#include<iostream>
class Observer
{
public:
	virtual void ReceiveMessage(std::string message) = 0;
};
class human :public Observer
{
public:
	void ReceiveMessage(std::string message)
	{
		//收到消息后做一些事情
		std::cout << "发生什么事了?" << message<<std::endl;
	}
};
class Object
{
public:
	virtual void addObserver(Observer* ob)=0;
	virtual void removeObserver(Observer* ob)=0;
	virtual void notifyObserver()=0;
protected:
	std::list<Observer*> ob_list_;
};
class ZooObject:public Object
{
public:
	void addObserver(Observer* ob)
	{
		ob_list_.emplace_back(ob);
	}
	void removeObserver(Observer* ob)
	{
		for (auto it = ob_list_.begin(); it != ob_list_.end(); it++)
		{
			if (*it == ob)
			{
				ob_list_.erase(it);
				break;
			}
		}
	}
	void notifyObserver()
	{
		for (auto i : ob_list_)
		{
			i->ReceiveMessage("动物园闭园了");
		}
	}
};
int main()
{
	human man1;
	human man2;
	human man3;
	//这三个B希望关注到动物园是不是闭园了 我们建立一个动物园状态 也就是被观察者
	ZooObject Zoo;
	Zoo.addObserver(&man1);
	Zoo.addObserver(&man2);
	Zoo.addObserver(&man3);
	Zoo.notifyObserver();
	Zoo.removeObserver(&man1);
	Zoo.notifyObserver();
}

测试一下:

 

猜你喜欢

转载自blog.csdn.net/qq_16401691/article/details/128229363