Patrones de diseño C++ Patrón de observador

Ya sea en el mundo real o en los sistemas de software, las personas a menudo se encuentran con un problema tal que el cambio de estado de un objeto provocará el cambio de estado de otros objetos, como los semáforos en la intersección, el automóvil se detiene cuando la luz roja está encendido, y la luz verde Si la luz está encendida, el automóvil funcionará, y si hace clic en un botón en el software, aparecerá una ventana. Existe una relación de dependencia entre estos objetos. El comportamiento de un objeto hará que otros objetos que dependen de él reaccionen. Para describir mejor la relación de dependencia entre los objetos, necesitamos aprender un nuevo patrón de diseño de comportamiento. Patrón de observador, que es uno de los patrones de diseño más utilizados en el diseño y desarrollo de software

Idea de definición : defina una relación de dependencia de uno a muchos entre objetos, de modo que cada vez que cambie el estado de un objeto, otros objetos relacionados sean notificados y actualizados automáticamente

ventajas :

  1. Realizó la separación de la capa de presentación y la capa de lógica de datos, y definió un mecanismo de entrega de actualización de mensajes estable
  2. El modo de observador admite la comunicación de transmisión y el objetivo de observación enviará una notificación a todos los observadores registrados, lo que simplifica la dificultad del diseño del sistema de uno a muchos.
  3. El modo de observador cumple con los requisitos del principio de abrir y cerrar, agregar nuevos observadores específicos no necesita modificar el código del sistema original

Desventajas :

  1. Si un objeto objetivo de observación tiene muchos observadores directos e indirectos, llevará mucho tiempo notificar a todos los observadores.
  2. Si existe una dependencia circular entre el observador y el objetivo de observación, el objetivo de observación activará una llamada circular entre ellos, lo que puede provocar que el sistema se bloquee.

Escenarios aplicables :

  1. Un objeto debe notificar a otros objetos sin saber quiénes son esos objetos.
  2. El cambio de un objeto hará que uno o más objetos cambien, y no se sabe cuántos objetos cambiarán, lo que reduce el acoplamiento entre los objetos Caso: 3 héroes luchan contra 1 monstruo,
    cuando el monstruo muere Todos los héroes deben ser notificados , no se requiere notificación cuando muere un héroe.

código :

//抽象的英雄
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;
};

prueba:

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;
}

Ejecute la captura de pantalla:
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_44443986/article/details/117556371
Recomendado
Clasificación