Tôi có một lớp Hoạt ảnh. Tôi cần có một số nhà quan sát cho các sự kiện Play
, Pause
và Stop
trong Hoạt ảnh. Tôi đã tìm thấy 2 giải pháp cho vấn đề này, nhưng tôi không biết phải chọn cái gì.Cách triển khai mẫu quan sát trong C++
Sử dụng boost :: tín hiệu hoặc một cái gì đó tương tự và đăng ký callbacks cho mỗi sự kiện
Thực hiện một giao diện đơn giản với 3 chức năng thuần túy ảo (
OnPlay()
,OnPause()
,OnStop()
) và chuyển cho các đối tượng lớp Animation rằng triển khai giao diện này.
Có những ưu điểm và nhược điểm cho mọi phương pháp. Tôi sẽ cố gắng liệt kê những cái mà tôi tìm thấy cho đến nay:
Ưu điểm cho 1.
- tôi có thể sử dụng bất kỳ chức năng thành viên/chức năng miễn phí như một callback
- tôi không có để thực hiện tất cả 3 chức năng nếu tôi không quan tâm đến tất cả chúng
- Cùng đối tượng có thể được sử dụng như quan sát viên cho nhiều hình ảnh động mà không đi tham số bổ sung từ lớp Animation
Nhược điểm cho 1.
- tôi phải tạo ra một đối tượng có thể được gọi cho mỗi callback
- Nếu tôi muốn bổ sung thêm sau một sự kiện mới nó sẽ khó có thể tìm ra nơi mà nó được sử dụng (trình biên dịch không thể thực thi tôi để thực hiện hoặc bỏ qua sự kiện mới).
- Cú pháp lạ nào đó (tôi phải sử dụng lệnh std :: bind/boost :: bind ở mọi nơi).
Ưu điểm cho 2.
- Dễ hiểu xây dựng
- Nếu tôi sẽ thêm một sự kiện mới trong lớp giao diện Animation/Observer trình biên dịch sẽ thực thi tôi để thực hiện (trống có thể) chức năng mới.
Nhược điểm cho 2.
- tôi phải thực hiện (trống có thể) 3 chức năng ngay cả khi tôi sẽ chỉ sử dụng một
- Cùng đối tượng không thể được sử dụng như quan sát viên cho nhau hoạt hình mà không gửi một số tham số bổ sung từ hoạt ảnh (ID hoặc thứ gì đó).
- Không thể sử dụng các chức năng miễn phí.
Bạn có thể vui lòng cho tôi biết nên sử dụng gì không? Từ kinh nghiệm của bạn những gì là tốt hơn cho vấn đề này - sự tự do từ aproach đầu tiên hoặc rõ ràng và dễ hiểu mã từ thứ hai?Bạn có thể vui lòng cho tôi những ưu điểm/nhược điểm khác cho cả hai phương pháp hoặc giải pháp khác không?
Trong C++ 11 (mà tôi giả sử bạn có thể sử dụng, kể từ khi bạn gắn thẻ câu hỏi với nó) lambdas loại bỏ hầu hết các "nhược điểm cho 1 ". –
Nếu sử dụng 'std :: bind' là cú pháp lạ đối với bạn (đặc biệt là so với giao diện với các hàm ảo 'OnWhatever'), thì bạn nên xem xét lại ngôn ngữ bạn chọn. –
@ChristianRau Không phải cho tôi, nhưng tôi không phải là người duy nhất làm việc trên cơ sở mã. – Felics