设计模式-观察者模式

shienh 2020年01月24日 196次浏览

观察者(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;
}