設計模式 -- 觀察者模式

觀察者模式:定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則全部依賴它的對象都會獲得通知並自動更新ios

#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被通知,狀態改變
相關文章
相關標籤/搜索