还是一个观察者模式?

时间:2014-09-29 19:33:16

标签: c++ design-patterns observer-pattern

通常当我看到有关观察者模式的教程时,我会看到一个名为notify的独特方法,但我想知道。如果我有不同的方法可以在不同时刻调用但需要在发生这种情况时通知其他方法怎么办?就像事件一样,我做错了吗?或者仍然开始观察者模式?

#include <iostream>
#include <algorithm>
#include <vector>

class Observer
{
public:
    virtual void notifyBefore() = 0;
    virtual void notifyAfter() = 0;
};

class Subject
{
public:
    void attachObserver(Observer * observer)
    {
        observers.push_back(observer);
    }

    void detachObserver(Observer * observer)
    {
        auto index = std::find(observers.begin(), observers.end(), observer);
        if (index != observers.end())
        {
            observers.erase(index);
        }
    }

    virtual void notifyBefore()
    {
        for (auto current : observers)
        {
            current->notifyBefore();
        }
    }

    virtual void notifyAfter()
    {
        for (auto current : observers)
        {
            current->notifyAfter();
        }
    }
private:
    std::vector<Observer *> observers;
};

class ConcreteObserver : public Observer
{
public:
    void notifyBefore()
    {
        std::cout << "You called me before..." << std::endl;
    }

    void notifyAfter()
    {
        std::cout << "You called me after..." << std::endl;
    }
};

class ConcreteSubject : public Subject
{
public:

};

int main()
{
    auto subject = new ConcreteSubject;
    subject->attachObserver(new ConcreteObserver);

    subject->notifyBefore();

    for (int i = 0; i < 5; ++i)
        std::cout << i << std::endl;

    subject->notifyAfter();
}

2 个答案:

答案 0 :(得分:1)

它仍然是观察者模式吗?确定

答案 1 :(得分:1)

您创建了一个包含两种类型的事件/通知的观察者模式。

你可以把它写成:

void notify(Type type);

其中Type是事件的类型(例如枚举)。

您还可以传递其他参数以指示与事件相关的其他参数。

void notify(Type type, std::string value);