2012-04-18 42 views
19

Tôi đến với Java từ thế giới C#, nơi mà mẫu Observer được triển khai như một ngôn ngữ hạng nhất được xây dựng với từ khóa event.Thay thế cho lớp Quan sát của Java?

Tôi thấy rằng Java có lớp Observable kể từ những ngày đầu, nhưng rõ ràng là có vấn đề triển khai và dường như không được sử dụng rộng rãi. Cho đến nay tôi mới chỉ triển khai thực hiện mẫu Observer trong mã Java của mình nhưng tôi luôn không thể không nghĩ rằng phải có một giải pháp thay thế tốt hơn để luôn luôn bật mã mẫu soạn sẵn này. Có các lớp Listener trong Swing nhưng chúng dường như không phù hợp với mã không Swing.

Giải pháp được đề xuất cho vấn đề phổ biến này là gì? Thư viện của bên thứ ba là ok với tôi.

+0

Tại sao các lớp người nghe không phù hợp với mã không phải Swing? – Jeffrey

+0

Dường như tất cả các giao diện và lớp học của EventListener đều nằm trong các gói Swing và AWT. Vì chúng nằm trong một gói chịu trách nhiệm về giao diện người dùng, việc sử dụng chúng cho giao diện người dùng không phải là một mùi xấu đối với tôi. EventListeners có được sử dụng bên ngoài các ngữ cảnh giao diện người dùng này không? – HolySamosa

+3

Ai sẽ ngăn cản bạn phát sinh các lớp người nghe của riêng bạn? 'EventListener' và' EventObject' đều nằm trong 'java.util', chúng không bị ràng buộc với AWT hoặc Swing theo bất kỳ cách nào. – Jeffrey

Trả lời

17

Thường thì mẫu quan sát viên được triển khai bằng giải pháp đặc biệt khi cần thiết. Khi nói đến các mẫu hành vi, đây là một trong những cách đơn giản nhất: hai phương pháp để kiểm soát danh sách "người quan sát" và một phương pháp thông báo cho người quan sát khi có điều gì đó thú vị xảy ra.

Mẫu quan sát có xu hướng phát sinh quá thường xuyên bên ngoài một số miền nhất định và khi phát sinh nó có xu hướng quá cụ thể đối với miền ứng dụng, vì vậy các giải pháp chung có ít giá trị. Bạn có thể thấy vấn đề với các lớp java.util.Observable: nếu bạn thừa hưởng từ Observable bạn phải chấp nhận tất cả các loại có thể có của "người quan sát" có thể được truyền cho bạn, mà có thể làm cho không có ý nghĩa đối với ứng dụng của bạn:

  • gì nếu đối tượng của bạn có thể tạo ra hai loại sự kiện khác nhau, và do đó cần hai danh sách quan sát khác nhau?
  • Điều gì xảy ra nếu người quan sát có thể ảnh hưởng đến đối tượng của bạn tùy thuộc vào sự kiện, ví dụ: bằng cách có thể phủ quyết thay đổi?

Điều đó nói rằng, EventBus from Google Guava dường như làm một công việc khá đơn giản để đơn giản hóa sự kiện sản xuất và xử lý bằng cách thực hiện một cách tiếp cận hoàn toàn khác.

Khác techniques based on annotations have been discussed on SO trước đây.

+0

Cảm ơn câu trả lời. Tôi không chắc chắn về tuyên bố của bạn về các giải pháp quan sát chung có giá trị nhỏ, mặc dù tôi có thể thấy đối số đó áp dụng cho việc thực hiện Observer của Java. Để hiển thị lại C#, Observer là công dân hạng nhất trong cấu trúc 'event' được sử dụng nhiều trong .NET. Tôi nghĩ rằng người quan sát chung chỉ cần được thực hiện đúng, và có lẽ trường hợp của nó là việc xây dựng ngôn ngữ thực sự cần thiết để kéo nó đi. – HolySamosa

+1

Có, cần xây dựng ngôn ngữ.Ví dụ nếu bạn có 'N' các loại sự kiện khác nhau, lớp đó phải được tăng cường với các tập các phương thức' N' để quản lý người nghe sự kiện. Nhưng một thư viện ngôn ngữ Java không thể thêm một số phương thức tùy ý vào các lớp mà nó được sử dụng. – Joni

+0

vấn đề chính chúng tôi đã có với util.Obserable hoặc ban đầu GoF phương pháp tiếp cận là trong một ứng dụng lớn, luồng, bế tắc, và hiệu suất trở nên điên rồ. chúng tôi đã biến ứng dụng của mình bằng phương pháp tiếp cận xe buýt thậm chí –

4

This article cho thấy triển khai tốt đẹp của mẫu bằng cách sử dụng Spring Framework. Bạn vẫn cần xác định giao diện Chủ thể và Quan sát viên (và triển khai), nhưng Spring xử lý đăng ký Observer cho Subjects thông qua cấu hình XML.

5

Tôi khuyên bạn nên xem xét reactive programming. Java chỉ có một triển khai mà tôi biết: reactive4java.

+0

Đề xuất tuyệt vời, cảm ơn. Gần đây tôi đã bắt đầu sử dụng phần mở rộng phản ứng trong phát triển C# của tôi và nó khá ấn tượng. – HolySamosa

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