设计模式 C++观察者模式

Posted WhiteShirtI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 C++观察者模式相关的知识,希望对你有一定的参考价值。

无论是在现实世界中还是在软件系统中,人们常常会遇到这样一类问题,一个对象的状态改变会引发其他对象的状态改变,如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行,再如点击软件中一个按钮,则会弹出一个窗口。这些对象之间存在一种依赖关系,一个对象的行为会导致依赖它的其他对象发生反应,为了更好地描述这种对象之间的依赖关系,我们需要学习一种新的行为型设计模式,即观察者模式,它是软件设计与开发中使用频率最高的设计模式之一

定义思想:定义对象间一种一对多的依赖关系,使得每当一个对象状态发生改变时,其他相关对象皆得到通知并自动更新

优点

  1. 实现了表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制
  2. 观察者模式支持广播通信,观察目标会向所有注册的观察者发出通知,简化了一对多系统设计的难度
  3. 观察者模式符合开闭原则的要求,增加新的具体观察者无须修改原有系统代码

缺点

  1. 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间
  2. 如果观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃

适用场景

  1. 一个对象必须通知其他对象,而并不知道这些对象时谁
  2. 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,降低了对象之间的耦合度
    案例:3个英雄打1个怪兽,当怪兽挂掉时需要通知所有英雄,当一个英雄阵亡时不需要通知。

代码

//抽象的英雄
class AbstractOHero
{
public:
	virtual void Update() = 0;
};

class HeroA : public AbstractOHero
{
public:
	HeroA()
	{
		cout << "英雄A正在打怪兽" << endl;
	}
	virtual void Update()
	{
		cout << "英雄A停止打怪兽" << endl;
	}
};

class HeroB : public AbstractOHero
{
public:
	HeroB()
	{
		cout << "英雄B正在打怪兽" << endl;
	}
	virtual void Update()
	{
		cout << "英雄B停止打怪兽" << endl;
	}
};

class HeroC : public AbstractOHero
{
public:
	HeroC()
	{
		cout << "英雄C正在打怪兽" << endl;
	}
	virtual void Update()
	{
		cout << "英雄C停止打怪兽" << endl;
	}
};

//抽象的观察目标
class AbstractBoss
{
public:
	//添加观察者
	virtual void addHero(AbstractOHero* hero) = 0;
	//删除观察者
	virtual void deleteHero(AbstractOHero* hero) = 0;
	//通知观察者
	virtual void notify() = 0;
};

//具体的观察者 BossA
class BossA : public AbstractBoss
{
public:
	//添加观察者
	virtual void addHero(AbstractOHero* hero)
	{
		pHeroList.push_back(hero);
	}
	//删除观察者
	virtual void deleteHero(AbstractOHero* hero)
	{
		pHeroList.remove(hero);
	}
	//通知观察者
	virtual void notify()
	{
		for (const auto& e : pHeroList)
		{
			e->Update();
		}
	}
private:
	list<AbstractOHero*> pHeroList;
};

测试:

void test()
{
	//创建观察者
	AbstractOHero* heroA = new HeroA();
	AbstractOHero* heroB = new HeroB();
	AbstractOHero* heroC = new HeroC();

	//创建观察目标
	AbstractBoss* bossA = new BossA();
	bossA->addHero(heroA);
	bossA->addHero(heroB);
	bossA->addHero(heroC);

	cout << "heroC挂了" << endl;
	bossA->deleteHero(heroC);

	cout << "Boss死了,通知其英雄" << endl;
	bossA->notify();

	delete heroA;
	delete heroB;
	delete heroC;
	delete bossA;
}

运行截图:
在这里插入图片描述

以上是关于设计模式 C++观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

C++观察者模式(发布-订阅)的使用

C++观察者模式(发布-订阅)的使用

C++观察者模式(发布-订阅)的使用

C++设计模式学习笔记:观察者模式 Observer

C++设计模式学习笔记:观察者模式 Observer

设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)