Tôi hơi buồn cười vì tất cả các câu trả lời ở đây đang cố gắng giải thích sự khác biệt tinh tế giữa các mẫu Observer và Pub / Sub mà không đưa ra bất kỳ ví dụ cụ thể nào. Tôi cá là hầu hết các độc giả vẫn không biết cách triển khai từng cái bằng cách đọc một cái là đồng bộ và cái kia không đồng bộ.
Một điều cần lưu ý là: Mục tiêu của các mẫu này là cố gắng tách mã
Observer là một mẫu thiết kế trong đó một đối tượng (được gọi là chủ thể) duy trì một danh sách các đối tượng tùy thuộc vào nó (người quan sát), tự động thông báo cho họ về bất kỳ thay đổi nào về trạng thái.
Mẫu quan sát
Điều này có nghĩa là observable object
có một danh sách nơi nó giữ tất cảobservers
(thường là các hàm). và có thể duyệt qua danh sách này và gọi các hàm này khi cảm thấy thời điểm tốt.
xem mẫu quan sát này ví dụ để biết chi tiết.
Mẫu này tốt khi bạn muốn lắng nghe bất kỳ thay đổi dữ liệu nào trên một đối tượng và cập nhật các khung nhìn UI khác tương ứng.
Nhưng Nhược điểm là Đài quan sát chỉ duy trì một mảng để giữ người quan sát
(trong ví dụ, mảng làobserversList
).
Nó KHÔNG phân biệt cách cập nhật được kích hoạt bởi vì nó chỉ có một notify function
, nó kích hoạt tất cả các chức năng được lưu trữ trong mảng đó.
Nếu chúng ta muốn nhóm người quan sát xử lý dựa trên các sự kiện khác nhau. Chúng ta chỉ cần sửa đổi nó observersList
thành Object
như thế
var events = {
"event1": [handler1, handler2],
"event2": [handler3]
}
xem ví dụ pubsub này để biết chi tiết.
và mọi người gọi biến thể này là pub/sub
. Vì vậy, bạn có thể kích hoạt các chức năng khác nhau dựa trên events
bạn đã xuất bản.