2013-02-14 31 views
2

我寫了一個簡單的觀察者模式,其中觀察者具有「void notify(std :: string)」函數,可觀察對象在每個註冊的觀察者上調用它並使用標記字符串傳輸數據。這是非常簡單,容易和有效的,但我需要向前邁進。如何使用觀察者模式的信號和插槽?

我需要實現它與信號和插槽(例如使用boost :: signals2)。但是我不知道插槽和信號的外觀應該如何以及它們應該如何放置。我也不知道如何允許註冊我想要的任何函數,而不僅僅是void(string)。

我找不到任何使用此模式的信號和插槽的良好資源。然而大家都說,信號和插槽對於觀察者模式來說是驚人的。你能指導我如何使用信號和插槽觀察者模式?

我沒有信號電流實現如下:

class observable 
{ 
public: 
void register(observer *); 
void unregister(observer *); 
protected: 
void notifyObservers() 
    { 
    for every registered observer 
    observer.notify(std::string tokenized_string); 
    } 
} 

class observer 
{ 
public: 
void notify(std::string) = 0; 
} 

我需要改變這種模式使用信號和槽,但我不知道應該怎麼樣是有用的,精心設計和靈活。

+0

什麼問題? – 2013-02-14 11:07:30

+0

@Denis Ermolin我不知道應該如何使用這種模式的信號和插槽(沒有信號的當前實現是不夠的)。這就是爲什麼我需要一點指導,它應該如何使用信號和插槽。 – user1873947 2013-02-14 11:08:16

+1

你讀過[** Boost.Signals **](http://www.boost.org/doc/libs/release/doc/html/signals.html)嗎? – Johnsyweb 2013-02-14 11:16:43

回答

5

Observer模式如何工作?

  • 觀察對象的「目送」通過觀察對象
  • 當可觀察到的被修改,它會通知通過調用其「更新」或「通知」功能(其所有觀察者的變化已經取得,例如或任何)

所以,在信號方面。 基本的是,你將信號連接到插槽,每次發出連接的信號時都會調用它。

您會發現在Observer模式中使用起來非常簡單:只需在Observable中創建一個信號,該信號將連接到用於更新它的每個Observer的插槽。

如果Observable發生變化。不要循環遍歷所有觀察者的名單,並且一個接一個地調用他們的方法,只是發出信號。魔術般地調用相應的插槽。

走得更遠,例如,你可以在可觀察的一個插槽,連接到一個信號,即觀察員將發出告訴它在變化的情況下要注意的可觀察......

燦」因爲我從來沒有使用過Boost::signals2,所以你應該看看How do I use boost::signals to implement the observer pattern?Observer design pattern in C++讓你去:)

+0

謝謝,現在我明白了。 – user1873947 2013-02-14 13:31:27