2014-09-29 67 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

在我看來,它仍然是觀察者模式的實現。看起來像一個非常直接的例子,我的觀察者 – mdw7326 2014-09-29 19:36:38

+3

方法的名稱並不重要。它是重要的「模式」即。對象的安排和階級結構。 – Galik 2014-09-29 19:36:42

+0

您認爲什麼讓您質疑它不是觀察者模式? :)綁定在那裏,模式在那裏! – zar 2014-09-30 14:06:32

回答

1

它仍然是觀察者模式嗎?確定

1

您創建了具有2種事件/通知類型的觀察者模式。

你可以寫它:

void notify(Type type); 

其中類型是事件的類型(例如枚舉)。

您還可以傳遞其他參數來指示與事件相關的其他參數。

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

就像一個戰略模式?它可能有幫助。 – yayuj 2014-09-29 20:26:35