2010-06-01 25 views
6

Tôi chỉ mới bắt đầu chơi với Observable, Observer và đó là phương pháp update() và tôi không thể hiểu mình nên làm gì khi các hành động khác nhau gọi notifyObservers().Làm cách nào để thực hiện các thao tác khác nhau trong bản cập nhật của Observer() trong Java?

Ý tôi là, lớp học Observable của tôi có một vài phương pháp khác nhau gọi số setChanged()notifyObservers() cuối cùng. Tùy thuộc vào phương thức được gọi, một số phần của giao diện người dùng (Swing) cần phải được cập nhật. Tuy nhiên, chỉ có một phương thức update() được triển khai trong lớp Observer.

Tôi mặc dù chuyển một cái gì đó đến phương pháp notifyObservers() và sau đó tôi có thể kiểm tra đối số trên update() nhưng nó không cảm thấy giống như một cách tốt để làm điều đó. Ngay cả khi nó đã làm, tôi nên vượt qua những gì? Một chuỗi có mô tả ngắn về hành động/phương pháp? Một int, giống như một mã hành động/phương pháp? Thứ gì khác?

Cách tốt nhất để xử lý tình huống này là gì?

Trả lời

7

nói chung, bạn nên cập nhật mọi thứ từ quan sát được khi bạn nhận được cuộc gọi để cập nhật(). nếu điều đó không thực tế, bạn có thể chuyển một gợi ý tới notificationObservers().

các băng đảng-of-book nói rằng một trong những hậu quả của mô hình quan sát là:.

" Cập nhật bất ngờ Bởi vì các quan sát viên không có kiến ​​thức về sự hiện diện của nhau, họ có thể bị mù với chi phí cuối cùng của việc thay đổi Một hoạt động dường như vô hại đối với chủ đề này có thể gây ra một loạt các cập nhật cho các nhà quan sát và các đối tượng phụ thuộc của họ.

Vấn đề này càng trầm trọng hơn bởi thực tế là giao thức cập nhật đơn giản không cung cấp chi tiết về những gì đã thay đổi trong chủ đề. o giúp các nhà quan sát khám phá những gì đã thay đổi, họ có thể bị buộc phải làm việc chăm chỉ để suy ra những thay đổi. " cũng đang được triển khai, họ nói:

" Tránh giao thức cập nhật dành riêng cho người quan sát: các mô hình đẩy và kéo. Việc triển khai mẫu Observer thường có chủ đề phát sóng thông tin bổ sung về thay đổi. Đối tượng chuyển thông tin này làm đối số để cập nhật. Lượng thông tin có thể thay đổi rất nhiều.

Ở cùng một mức độ mà chúng tôi gọi là mô hình đẩy, chủ thể sẽ gửi cho người quan sát thông tin chi tiết về thay đổi, cho dù họ có muốn hay không. Ở cực khác là mô hình kéo; đối tượng không gửi gì ngoài thông báo tối thiểu nhất và các nhà quan sát yêu cầu chi tiết một cách rõ ràng sau đó.

Mô hình kéo nhấn mạnh sự thiếu hiểu biết của chủ thể về các quan sát viên, trong khi mô hình đẩy giả định các đối tượng biết điều gì đó về nhu cầu của người quan sát. Mô hình đẩy có thể làm cho các nhà quan sát ít sử dụng lại hơn, bởi vì các lớp Chủ đề đưa ra các giả định về các lớp Observer có thể không phải lúc nào cũng đúng. Mặt khác, mô hình kéo có thể không hiệu quả, bởi vì các lớp Observer phải xác định những gì đã thay đổi mà không có sự trợ giúp của Subject. "

3

Tham số thứ hai là update() là loại Object, vì vậy bạn có thể chuyển bất kỳ thứ gì phù hợp. Như bạn lưu ý, cách tiếp cận này khá chung chung. Ngược lại, một lớp duy trì EventListenerList có thể nhận được mức độ an toàn kiểu thời gian chạy khi được sử dụng như được chỉ định.

Các vấn đề liên quan