观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
#include <iostream>
#include <list>
using namespace std;
//抽象英雄 抽象的观察者
class AbstractHero{
public:
virtual void Update()=0;
};
class HeroA:public AbstractHero{
public:
HeroA(){
cout<<"HeroA"<<endl;
}
virtual void Update(){
cout<<"HeroA stop attack"<<endl;
}
};
class HeroB:public AbstractHero{
public:
HeroB(){
cout<<"HeroB"<<endl;
}
virtual void Update(){
cout<<"HeroB stop attack"<<endl;
}
};
class HeroC:public AbstractHero{
public:
HeroC(){
cout<<"HeroC"<<endl;
}
virtual void Update(){
cout<<"HeroC stop attack"<<endl;
}
};
//观察目标
class AbstractBoss{
public:
//添加观察者
virtual void addHere(AbstractHero* hero)=0;
//删除观察者
virtual void deleteHere(AbstractHero* hero)=0;
//通知所有观察者
virtual void notify()=0;
};
class BossA:public AbstractBoss{
public:
//添加观察者
virtual void addHere(AbstractHero* hero){
heroList.push_back(hero);
}
//删除观察者
virtual void deleteHere(AbstractHero* hero){
heroList.remove(hero);
}
//通知所有观察者
virtual void notify(){
for(list<AbstractHero*>::iterator it = heroList.begin();it!=heroList.end();it++){
//boss死亡 停止攻击boss
(*it)->Update();
}
}
public:
list<AbstractHero*> heroList;
};
int main(int argc, char *argv[])
{
AbstractHero* heroA=new HeroA;
AbstractHero* heroB=new HeroB;
AbstractHero* heroC=new HeroC;
AbstractBoss* bossA = new BossA;
bossA->addHere(heroA);
bossA->addHere(heroB);
bossA->addHere(heroB);
//hereA阵亡
bossA->deleteHere(heroA);
//boss阵亡,heroB,heroC停止攻击,hereA阵亡,无需停止heroA,
bossA->notify();
return 0;
}