Tôi đã tạo hai lớp trừu tượng Chủ đề và Người quan sát xác định giao diện mẫu Quan sát cổ điển. Tôi xuất phát từ chúng để thực hiện mẫu Observer. Một người quan sát có thể trông như thế này:
void MyClass::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
Điều này là tốt và nó cho tôi biết ai đã thay đổi một cái gì đó. Tuy nhiên, nó không cho tôi biết điều gì đã thay đổi. Đôi khi điều này là ổn vì tôi sẽ truy vấn Chủ đề cho dữ liệu mới nhất, nhưng lần khác tôi cần biết chính xác những gì đã thay đổi trên Chủ đề. Tôi nhận thấy trong Java họ có cả phương thức notifyObservers () và phương thức notifyObservers (Object arg) để chỉ định chi tiết về những gì đã thay đổi.
Trong trường hợp của tôi, tôi cần biết liệu một trong hai hành động khác nhau có xảy ra với chủ đề hay không, và nếu đó là một hành động cụ thể, để biết một số nguyên liên quan đến hành động đó.
Vì vậy, câu hỏi của tôi là:
- Cách C ++ để vượt qua một đối số chung (như Java) là gì?
- Observer thậm chí là mô hình tốt nhất? Có lẽ một số loại hệ thống sự kiện?
CẬP NHẬT
Tôi đã tìm thấy bài viết này nói về việc tạo khuôn mẫu cho Người quan sát: Triển khai mẫu Chủ đề / Người quan sát bằng các mẫu . Điều này làm tôi tự hỏi nếu bạn có thể tạo mẫu một đối số.
Tôi đã tìm thấy câu hỏi tràn ngăn xếp này nói về việc tạo khuôn mẫu cho đối số: Mẫu Trình quan sát chủ đề dựa trên mẫu - Tôi nên sử dụng static_cast hoặc Dynamic_cast . Tuy nhiên, OP dường như có một vấn đề mà chưa ai trả lời.
Một điều khác tôi có thể làm là thay đổi phương thức Cập nhật để lấy một đối tượng EventArg như trong:
void MyClass::Update(Subject *subject, EventArg arg)
{
...
Và sau đó tạo các lớp con của EventArg cho dữ liệu đối số cụ thể, và sau đó tôi đoán chuyển nó trở lại lớp con cụ thể trong phương thức cập nhật.
CẬP NHẬT 2
Cũng tìm thấy một bài viết, Về việc tạo một khung c ++ dựa trên thông điệp không đồng bộ; phần 2 thảo luận về việc Chủ đề truyền đạt chi tiết về những gì đã thay đổi.
Bây giờ tôi nghiêm túc xem xét việc sử dụng Boost.Signals . Sử dụng mẫu quan sát riêng của tôi có ý nghĩa khi nó đơn giản, nhưng tạo khuôn mẫu cho kiểu và một đối số đang bắt đầu trở nên phức tạp. Và tôi có thể cần sự an toàn của luồng Boost.Signals2.
CẬP NHẬT 3
Tôi cũng tìm thấy một số bài viết thú vị về mẫu người quan sát:
Tổng quát hóa Người quan sát bằng Herb Sutter
Triển khai mẫu Người quan sát trong C ++ - Phần 1
Kinh nghiệm thực hiện mẫu thiết kế quan sát viên (Phần 2)
Kinh nghiệm thực hiện mẫu thiết kế quan sát viên (Phần 3)
Tuy nhiên, tôi đã chuyển việc triển khai của mình sang sử dụng Boost.Signals, trong khi có thể được thực hiện cho mục đích của tôi, đang hoạt động thành công. Và có lẽ bất kỳ mối quan tâm về sự phình to hoặc tốc độ là không liên quan.