观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新

#include <iostream>
#include <list>

//AbstractObserver(抽象观察者)
//——为那些在目标发生改变时需获得通知的对象定义一个更新接口。
class AbstractObserver
{
public:
    virtual void update() = 0;
};

//具体观察者
//——维护一个指向具体观察对象的引用;
//——存储有关状态,这些状态应与目标的状态保持一致;
//——实现AbstractObserver的更新接口以使自身状态与目标的状态保持一致。
class Observer1 : public AbstractObserver
{
public:
    Observer1()
    {
        std::cout << "Observer1未被通知,状态不变" << std::endl;
    }
    virtual void update()
    {
        std::cout << "Observer1被通知,状态改变" << std::endl;
    }
};

class Observer2 : public AbstractObserver
{
public:
    Observer2()
    {
        std::cout << "Observer2未被通知,状态不变" << std::endl;
    }
    virtual void update()
    {
        std::cout << "Observer2被通知,状态改变" << std::endl;
    }
};

class Observer3 : public AbstractObserver
{
public:
    Observer3()
    {
        std::cout << "Observer3未被通知,状态不变" << std::endl;
    }
    virtual void update()
    {
        std::cout << "Observer3被通知,状态改变" << std::endl;
    }
};

//AbstractSubject(抽象观察目标)
//——目标知道它的观察者。可以有任意多个观察者观察同一个目标;
//——提供注册和删除观察者对象的接口。
class AbstractSubject
{
public:
    //添加观察者
    virtual void AddObserver(AbstractObserver* observer) = 0;
    //删除观察者
    virtual void DeleteObserver(AbstractObserver* observer) = 0;
    //通知所有观察者
    virtual void NotifyAllObserver() = 0;
};



//具体观察者
//——维护一个指向ConcreteSubject对象的引用;
//——存储有关状态,这些状态应与目标的状态保持一致;
//——实现Observer的更新接口以使自身状态与目标的状态保持一致。
class Subject : public AbstractSubject
{
public:
    //添加观察者
    virtual void AddObserver(AbstractObserver* observer)
    {
        ObserverList.push_back(observer);
    }
    //删除观察者
    virtual void DeleteObserver(AbstractObserver* observer)
    {
        ObserverList.remove(observer);
    }
    //通知所有观察者
    virtual void NotifyAllObserver()
    {
        for (std::list<AbstractObserver*>::iterator it = ObserverList.begin(); it != ObserverList.end(); it++)
        {
            (*it)->update();
        }
    }

    //具体观察者列表
    std::list<AbstractObserver*> ObserverList;
};


void test()
{
    //创建观察者
    AbstractObserver* observer1 = new Observer1;
    AbstractObserver* observer2 = new Observer2;
    AbstractObserver* observer3 = new Observer3;

    //创建观察目标
    AbstractSubject* subject = new Subject;

    //添加观察目标
    subject->AddObserver(observer1);
    subject->AddObserver(observer2);
    subject->AddObserver(observer3);

    std::cout << "观察者收到通知" << std::endl;
    subject->NotifyAllObserver();
}

int main()
{
    test();

    return 0;
}


//打印结果:
Observer1未被通知,状态不变
Observer2未被通知,状态不变
Observer3未被通知,状态不变
观察者收到通知
Observer1被通知,状态改变
Observer2被通知,状态改变
Observer3被通知,状态改变

Simple
10 声望4 粉丝