设计模式--观察者模式示例代码

观察者模式:

随着交通信号灯的变化,汽车的行为也将随之而变化,一盏交通信号灯可以指挥多辆汽车。

 

或者说,当我们下课的时候,大家有吃东西,睡觉的,和说话的,当上课铃一响,大家都开始上课听讲,上课铃这个对象的状态从不响到响,使得其他学生对象的状态改变

 

抽象主题(Subject)角色:主题角色把所有对观察考对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现。

抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。抽象观察者角色一般用一个抽象类或者一个接口实现。在这个示意性的实现中,更新接口只包含一个方法(即Update()方法),这个方法叫做更新方法。

具体主题(ConcreteSubject)角色:将有关状态存入具体现察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者角色(Concrete Observable)。具体主题角色通常用一个具体子类实现。

具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体现察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体现察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。

从具体主题角色指向抽象观察者角色的合成关系,代表具体主题对象可以有任意多个对抽象观察者对象的引用。之所以使用抽象观察者而不是具体观察者,意味着主题对象不需要知道引用了哪些ConcreteObserver类型,而只知道抽象Observer类型。这就使得具体主题对象可以动态地维护一系列的对观察者对象的引用,并在需要的时候调用每一个观察者共有的Update()方法。这种做法叫做”针对抽象编程”。


观察者模式是用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个

 

代码示例:

三个英雄打boss,boss出现会使玩家攻击,boss死亡会引起玩家停止攻击

代码中:抽象英雄类,具体英雄类,抽象boss类,具体boss类

#include <iostream>
#include <list>
using namespace std;

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

//具体英雄类
class HeroA : public AbstractHero
{
public:
	HeroA() {
		cout << "英雄A正在撸BOSS" << endl;
	}
	virtual void Update() {
		cout << "英雄A停止攻击" << endl;
	}
};

class HeroB : public AbstractHero
{
public:
	HeroB() {
		cout << "英雄B正在撸BOSS" << endl;
	}
	virtual void Update() {
		cout << "英雄B停止攻击" << endl;
	}
};

class HeroC : public AbstractHero
{
public:
	HeroC() {
		cout << "英雄C正在撸BOSS" << endl;
	}
	virtual void Update() {
		cout << "英雄C停止攻击" << endl;
	}
};


//抽象观察目标类
class AbstractBoss {
public:
	virtual void AddHero(AbstractHero* hero) = 0;		 //添加观察者
	virtual void DeleteHero(AbstractHero* hero) = 0;  //删除观察者
	virtual void Notify() = 0;						 //通知所有观察者
};

//具体观察目标类
class Boss : public AbstractBoss
{
public:
	virtual void AddHero(AbstractHero* hero) {
		pHero.push_back(hero);
	}
	virtual void DeleteHero(AbstractHero* hero) {
		pHero.remove(hero);
	}
	virtual void Notify() {
		for (list<AbstractHero*>::iterator it = pHero.begin(); it != pHero.end(); it++)
		{
			(*it)->Update();
		}
	}
public:
	list<AbstractHero*> pHero;
};

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

	//创建观察目标

	AbstractBoss* boss = new Boss;
	//添加观察者
	boss->AddHero(heroA);
	boss->AddHero(heroB);
	boss->AddHero(heroC);

	cout << "heroC阵亡。。。" << endl;
	boss->DeleteHero(heroC);
	cout << "Boss阵亡,通知其他英雄" << endl;
	boss->Notify();

	delete boss;
	delete heroA;
	delete heroB;
	delete heroC;

}


int main()
{
	test();
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿尔兹

如果觉得有用就推荐给你的朋友吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值