2011-02-10 37 views
15

Như tôi đã hiểu, mẫu quan sát viên cho phép nhiều người quan sát theo dõi một chủ đề duy nhất. Có một mô hình cho kịch bản ngược lại không? Có một mô hình cho một người quan sát duy nhất theo dõi một số đối tượng và phản hồi khi bất kỳ ai trong số họ tăng lên, nói, một sự kiện Thông báo?Ngược lại với mô hình quan sát là gì?

+0

Đây chỉ là một người quan sát có nhiều quan sát. Vì vậy, tất cả các Observable sẽ cập nhật một Observer đơn khi trạng thái của chúng thay đổi, và Observer vẫn có thể phân biệt các Observable khác nhau khi cập nhật của nó (Observable o, Object arg) được gọi. –

+0

Tôi cảm thấy sự thay đổi duy nhất ở đây là Observer nên tự động đăng ký để quan sát mới khi nó có sẵn trong thời gian chạy.Có nghĩa là khi mới quan sát được đưa lên; sau đó điều này phải được truyền đạt đến Observer để đăng ký nó. Cách khác là khi Observer mới được đưa lên; đối tượng Observer này luôn được xây dựng với Observable trong hàm tạo của chúng. Vì vậy, một cái gì đó như constructor Observable nên chấp nhận rằng Observer duy nhất khi nó được đưa lên. –

Trả lời

13

Mẫu Observer vẫn có thể được sử dụng: chỉ cần đăng ký đối tượng giống như một người quan sát với nhiều đối tượng được giám sát. Có thể bạn sẽ muốn sự kiện "Thông báo" nhận được một số loại định danh đối tượng quan sát (con trỏ "this", số id duy nhất v.v.) để đối tượng quan sát có thể chọn một hành động thích hợp với đối tượng báo cáo sự kiện.

+2

Suy nghĩ của tôi chính xác. Điều này vẫn có vẻ giống như một mẫu người quan sát đối với tôi. –

+0

Trừ khi anh ta chỉ muốn trình xử lý sự kiện chạy một lần, bất kể có bao nhiêu nhà xuất bản kích hoạt sự kiện. –

+1

Để thêm vào điều này: http://sourcemaking.com/design_patterns/observer (sử dụng một Trình quan sát duy nhất là "trái với ý của nhà thiết kế") và http://www.eecho.info/Echo/design-pattern/observer-java-pattern/(các biến thể là "Quan sát đơn lẻ so với nhiều người quan sát") – anon

3

Có. Nó chỉ là một ứng dụng khác của mẫu người quan sát.

Máy quan sát tự thêm vào nhiều đối tượng. Nếu bạn muốn thực hiện cùng một hành động bất kể bạn đang quan sát đối tượng nào thì điều này hoàn toàn giống với mẫu Observer bạn đang sử dụng.

Nếu bạn muốn một hành động riêng biệt tùy thuộc vào Chủ thể nào đã kích hoạt sự kiện thì bạn có thể sử dụng tham số Hành động được chuyển vào phương thức ActionPerformed của Observer để giúp xác định chủ thể nào đã kích hoạt sự kiện. (những tên này có thể thay đổi tùy thuộc vào ngôn ngữ hoặc thư viện bạn chọn)

+0

Cảm ơn, WuHo, dành thời gian để trả lời câu hỏi của tôi. – blueshift

0

nếu bạn chỉ muốn người quan sát phản ứng một lần, bất kể có bao nhiêu đối tượng được giám sát tăng sự kiện, bạn sẽ phải có một phần của trình xử lý sự kiện " unregister "người quan sát từ tất cả các nguồn khác khi nguồn đầu tiên kích hoạt sự kiện hoặc bạn sẽ phải quyết định mức độ thường xuyên hoặc tiêu chí thời gian nào được sử dụng để quyết định thời điểm sự kiện từ một nguồn khác (hoặc cùng một nguồn sau một khoảng thời gian nhất định) làm cho người quan sát phản ứng lại ...

+0

Tôi có thể muốn sử dụng lời khuyên của bạn ở đây vì tôi muốn đối tượng bị vô hiệu hóa sau khi nó tăng sự kiện Thông báo của nó. – blueshift

1

Nếu đối tượng quan sát tương tự, thì bạn có thể khiến người quan sát theo dõi tất cả, nếu không, tôi nghĩ bạn nên tách biệt hơn, sau đó bạn sẽ theo dõi quy tắc trách nhiệm duy nhất.

1

Cũng xem xét mẫu Mediator liên quan.

Mediator mẫu định nghĩa một đối tượng mà gói gọn như thế nào một tập các đối tượng tương tác thông tin (Wikipedia)

More đây: http://sourcemaking.com/design_patterns/mediator

Tôi cũng rất thích @ câu trả lời của CDC về Mediator Vs Observer Object-Oriented Design Patterns:

Mẫu quan sát: Xác định mô hình một-nhiều độ trễ giữa các đối tượng sao cho khi một đối tượng thay đổi trạng thái, tất cả các phụ thuộc của nó sẽ được thông báo và cập nhật tự động.

Mẫu hòa giải: Xác định đối tượng đóng gói cách một tập hợp các đối tượng tương tác. Người hòa giải khuyến khích ghép nối lỏng lẻo bằng cách giữ cho các đối tượng không liên quan đến nhau một cách rõ ràng, và nó cho phép bạn thay đổi tương tác của họ một cách độc lập.

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