Tôi đang thiết kế một mô hình quan sát viên mà nên làm việc theo cách này: quan sát gọi AddEventListener
phương pháp EventDispatcher
và vượt qua một chuỗi đó là tên của event
, PointerToItself và PointerToItsMemberMethodC++ riêng Observer Pattern
Sau đó event
xảy ra bên trong của EventDispatcher
; nó xem qua danh sách đăng ký và nếu có, một số được gán cho sự kiện này gọi phương thức action
của observer
.
Tôi đã đến số này EventDispatcher.h
. THẬN TRỌNG chứa bit mã giả.
Các hai câu hỏi:
- Làm thế nào để xác định các loại
action
trongstruct Subscription
? - Tôi có đang di chuyển đúng không?
PS: Không, Tôi sẽ không sử dụng boost
hoặc bất kỳ các thư viện khác.
#pragma once
#include <vector>
#include <string>
using namespace std;
struct Subscription
{
void* observer;
string event;
/* u_u */ action;
};
class EventDispatcher
{
private:
vector<Subscription> subscriptions;
protected:
void DispatchEvent (string event);
public:
void AddEventListener (Observer* observer , string event , /* u_u */ action);
void RemoveEventListener (Observer* observer , string event , /* u_u */ action);
};
Tiêu đề này thực hiện như thế này trong EventDispatcher.cpp
#include "EventDispatcher.h"
void EventDispatcher::DispatchEvent (string event)
{
int key = 0;
while (key < this->subscriptions.size())
{
Subscription subscription = this->subscriptions[key];
if (subscription.event == event)
{
subscription.observer->subscription.action;
};
};
};
void EventDispatcher::AddEventListener (Observer* observer , string event , /* */ action)
{
Subscription subscription = { observer , event , action);
this->subscriptions.push_back (subscription);
};
void EventDispatcher::RemoveEventListener (Observer* observer , string event , /* */ action)
{
int key = 0;
while (key < this->subscriptions.size())
{
Subscription subscription = this->subscriptions[key];
if (subscription.observer == observer && subscription.event == event && subscription.action == action)
{
this->subscriptions.erase (this->subscriptions.begin() + key);
};
};
};
Để xấu bạn' không sử dụng tăng, vì điều đó sẽ cho phép một giải pháp an toàn dễ dàng và loại sẽ tốt hơn cách tiếp cận hiện tại của bạn và linh hoạt hơn. Các giải pháp C++ 11 có được phép không? – Ylisar
Tôi chưa thực sự biết, C++ 11 là gì ... Đó là một tiêu chuẩn mới, đúng không? Tôi tự hỏi, nếu 'g ++' của tôi biết nó chưa? Tiêu chuẩn mới là ok để sử dụng, nó không phải là một thư viện ... – Kolyunya