2014-09-29 4 views
1

보통 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

내 의견으로는 여전히 Observer 패턴의 구현입니다. 옵서버의 예가 꽤 똑바로 보입니다. – mdw7326

+3

메소드의 이름은 중요하지 않습니다. 그것은 즉 중요한 패턴입니다. 사물의 배열과 계급 구조. – Galik

+0

당신은 그것이 관찰자 패턴이 아니라고 질문하게 생각합니까? :) 바인딩은 거기에, 거기 패턴입니다! – zar

답변

1

여전히 관찰자 패턴입니까?

1

두 가지 유형의 이벤트/알림을 사용하여 관찰자 패턴을 만들었습니다.

당신은 그것을 작성 수 :

유형 이벤트의 형태 (예를 들어 열거를)입니다
void notify(Type type); 

.

다른 매개 변수를 전달하여 이벤트와 관련된 다른 매개 변수를 나타낼 수도 있습니다.

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

전략 패턴이 좋아? 도움이 될 수도 있습니다. – yayuj