我正在爲2D圖形系統設計一個簡單的事件管理器。
設計看起來像這樣。
要添加事件,您必須定義2個成員函數和一個向量。
但是這些代碼可能會一遍又一遍地重複。什麼是避免重複代碼的最佳設計?
class EventManager
{
private:
typedef std::function<void(float,float)> MouseClickFunction;
public:
void registerMouseClickHandler(MouseClickFunction f)
{
mouseClickHandlers.push_back(f);
}
void reportMouseClickEvent(float x, float y)
{
for(auto& f: mouseClickHandlers)
f(x,y);
}
private:
std::vector<std::function<void(float,float)>> mouseClickHandlers;
};
如何使添加事件的過程更簡單?
(我不是在尋找類似Qt的連接或Boost.Signals,這將是這個太複雜了,在我看來)。
而不是讓你的處理程序接受兩個浮點參數,定義'struct MouseClickEventArgs {float;浮動; }'而是接受。對所有事件處理程序遵循相同的模式。然後,您可以對參數類型進行模板化,並且只有一個EventManager而不是重複。 –
dlf
2014-11-03 18:46:28
一般而言,如果用戶數量不變,則不需要矢量。如果您想要動態更改訂閱者或偵聽器的數量,則需要一個向量。研究「發佈者/訂戶」設計模式。 – 2014-11-03 18:46:33
@dif:代碼仍然重複,您可以更輕鬆地重複代碼。 – 2014-11-03 18:47:31