2014-09-29 4 views
1

Обычно, когда я вижу учебники о шаблоне наблюдателя, я вижу уникальный метод, называемый 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

По-моему, это по-прежнему реализация шаблона Observer. Кажется, это довольно простой пример Observer для меня – mdw7326

+3

Имена методов не важны. это «шаблон», который имеет значение, т.е. расположение объектов и классовая структура. – Galik

+0

Как вы думаете, что вы думаете о том, что это не шаблон наблюдателя? :) Связывание там, шаблон есть! – zar

ответ

1

Является ли это модель наблюдателя? sure

1

Вы создали шаблон наблюдателя с 2 типами событий/уведомлений.

Вы могли бы написать как:

void notify(Type type); 

Где Тип является тип события (например, перечисление).

Вы также можете передать другие параметры, чтобы указать другие параметры, относящиеся к событию.

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

Как шаблон стратегии? Это может помочь. – yayuj

Смежные вопросы