Mẫu thiết kế quan sát vs người nghe


136

Dường như với tôi rằng mẫu thiết kế Observer như được mô tả trong GOF thực sự giống với mẫu Người nghe được tìm thấy trong các bộ công cụ khác nhau. Có sự khác biệt giữa các khái niệm, hoặc Người nghe và Người quan sát thực sự giống nhau.

(Tôi không tìm kiếm bất kỳ triển khai ngôn ngữ máy tính cụ thể nào. Tôi chỉ muốn hiểu sự khác biệt (nếu có) từ quan điểm thiết kế. Vâng, tôi biết có một số câu trả lời cho các câu hỏi tương tự trên SOF, nhưng chúng đã được root trong các câu hỏi cụ thể về các ngôn ngữ cụ thể - Tôi đang tìm kiếm một câu trả lời thiết kế, không phải là một câu trả lời ngôn ngữ.)


19
Trong mã trước, mã này xem mã khác để di chuyển, trong khi mã sau nghe mã khác cho bất kỳ nhiễu nào.
nate c

2
GOF có nghĩa là gì?
dekaru

Câu trả lời:


60

Việc thuật ngữ "người nghe" có đề cập đến mẫu Người quan sát hay không sẽ phụ thuộc vào ngữ cảnh. Ví dụ: "Trình lắng nghe sự kiện" của Java Swing là một phần của việc triển khai mẫu Trình quan sát trong khi .Net "Trình theo dõi dấu vết" thì không.

Không có gì lạ khi các tác giả khung gán các tên khác nhau cho các thành phần tham gia triển khai mẫu đã cho, nhưng tên mẫu chính thức thường được sử dụng khi thảo luận về chính các mẫu.

Liên quan đến thiết kế, việc thực hiện một mẫu nhất định thường sẽ bị ảnh hưởng bởi ngôn ngữ và nền tảng được sử dụng. Do đó, việc triển khai cụ thể mẫu Quan sát viên trong một khung nhất định (có thể tình cờ sử dụng thuật ngữ "người nghe" để mô tả vai trò của ConcreteObserver) có thể hơi khác so với mô tả trong sách Mẫu thiết kế.


26

Có một bản chất hai chiều để mô tả về Người quan sát trong các mẫu thiết kế của Gamma et. al. (GoF).

Trong mô tả của họ về Người quan sát, một trong những ConcreteObservers có thể báo hiệu sự thay đổi đối với Chủ đề của nó. Chủ đề, chứa một danh sách tất cả ConcreteObservers, sau đó thông báo danh sách của nó. Tất cả ConcreteObservers, bao gồm cả động cơ chính, sau đó phản ứng khi thích hợp.

Các triển khai chung của Người nghe dường như đều phản ứng với các sự kiện từ bên ngoài.

Vì vậy, tôi muốn nói rằng Người nghe là một trường hợp ít khái quát hơn về Người quan sát.


4

Một người nghe cũng có thể là một thực hiện của mẫu quan sát viên. Một người nghe về cơ bản đang chờ đợi một sự kiện xảy ra trên một đối tượng nhất định, đó là những gì một người quan sát làm.

Tôi biết bạn không theo câu trả lời cụ thể về ngôn ngữ, nhưng thật khó để nói về nội dung này trong bản tóm tắt. Vì vậy, nếu tôi điều tra vấn đề này trong .NET, tôi sẽ có xu hướng mở một hội đồng chứa trình nghe trong .NET Reflector, điều này sẽ cho phép tôi tháo rời tổ hợp và kiểm tra logic của nó theo mẫu thiết kế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.