Sự khác biệt giữa Observer, Pub / Sub và Data Binding


163

Sự khác biệt giữa Mẫu quan sát , Xuất bản / Đăng kýRàng buộc dữ liệu là gì?

Tôi đã tìm kiếm xung quanh một chút trên Stack Overflow và không tìm thấy câu trả lời hay nào.

Điều tôi đã tin là ràng buộc dữ liệu là một thuật ngữ chung và có nhiều cách khác nhau để thực hiện nó như Mẫu quan sát hoặc mẫu Pub / Sub. Với mẫu Observer, một Observable cập nhật các Observers của nó. Với Pub / Sub, 0 - nhiều nhà xuất bản có thể xuất bản tin nhắn của một số lớp nhất định và 0 - nhiều người đăng ký có thể đăng ký tin nhắn của một số lớp nhất định.

Có các mô hình thực hiện "ràng buộc dữ liệu" khác không?


Tôi đã tìm thấy một cái khác: kiểm tra bẩn đó là những gì Angular.js làm. Thêm thông tin ở đây: stackoverflow.com/questions/9682092/databinding-in-angularjs
Jess

Câu trả lời:


143

Đây là của tôi về ba:

Ràng buộc dữ liệu

Về cơ bản, cốt lõi chỉ có nghĩa là "giá trị của thuộc tính X trên đối tượng Y bị ràng buộc về mặt ngữ nghĩa với giá trị của thuộc tính A trên đối tượng B. Không có giả định nào về cách Y biết hoặc được cho ăn thay đổi đối tượng B.

Người quan sát, hoặc Người quan sát / Người quan sát

Một mẫu thiết kế theo đó một đối tượng được thấm nhuần khả năng thông báo cho những người khác về các sự kiện cụ thể - thường được thực hiện bằng cách sử dụng các sự kiện thực tế, giống như các vị trí trong đối tượng có hình dạng của một chức năng / phương thức cụ thể. Người quan sát là người cung cấp thông báo và người quan sát nhận được những thông báo đó. Trong .net, có thể quan sát có thể phơi bày một sự kiện và người quan sát đăng ký sự kiện đó bằng một cái móc hình "xử lý sự kiện". Không có giả định nào được đưa ra về cơ chế cụ thể mà thông báo xảy ra, cũng như về số lượng người quan sát mà một người có thể quan sát có thể thông báo.

Quán rượu / phụ

Một tên khác (có lẽ với ngữ nghĩa "phát sóng" nhiều hơn) của mẫu Observable / Observer, thường ngụ ý hương vị "động" hơn - người quan sát có thể đăng ký hoặc hủy đăng ký thông báo và một người có thể quan sát có thể "hét lên" với nhiều người quan sát. Trong .NET, người ta có thể sử dụng các sự kiện tiêu chuẩn cho việc này, vì các sự kiện là một dạng của MulticastDelegate và do đó có thể hỗ trợ phân phối các sự kiện cho nhiều người đăng ký và cũng hỗ trợ hủy đăng ký. Pub / Sub có một ý nghĩa hơi khác nhau trong các bối cảnh nhất định, thường liên quan đến nhiều "ẩn danh" hơn giữa sự kiện và eventer, có thể được tạo điều kiện bởi bất kỳ số lượng trừu tượng nào, thường liên quan đến một số "người trung gian" (như hàng đợi tin nhắn), người biết tất cả các bên, nhưng các bên riêng lẻ không biết về nhau.

Ràng buộc dữ liệu, Redux

Trong nhiều mẫu "giống như MVC", có thể quan sát thấy một số cách "thông báo thay đổi thuộc tính" cũng chứa thông tin về thuộc tính cụ thể đã thay đổi. Người quan sát ẩn, thường được tạo bởi khung và đăng ký các thông báo này thông qua một số cú pháp ràng buộc để xác định cụ thể một đối tượng và thuộc tính và "trình xử lý sự kiện" chỉ sao chép giá trị mới, có khả năng kích hoạt bất kỳ logic cập nhật hoặc làm mới nào.

Liên kết dữ liệu lại Redux

Một thực hiện thay thế cho ràng buộc dữ liệu? Ok, đây là một điều ngu ngốc:

  • một luồng nền được bắt đầu liên tục kiểm tra thuộc tính ràng buộc trên một đối tượng.
  • nếu luồng đó phát hiện ra rằng giá trị của thuộc tính đã thay đổi kể từ lần kiểm tra cuối cùng, hãy sao chép giá trị sang mục bị ràng buộc.

Tôi đánh giá cao câu trả lời của bạn và cố gắng thực hiện một ý tưởng ràng buộc dữ liệu khác.
Jess

@jessemon heh, không vấn đề gì; mô hình quan sát viên chắc chắn là cách tiếp cận "tốt nhất một cách trừu tượng" mà tôi biết, nhưng ví dụ nhỏ khủng khiếp của tôi cũng sẽ "thực hiện ràng buộc dữ liệu", mặc dù theo cách hỗn loạn và không hiệu quả.
JerKimball

7
Thành thật mà nói, tôi mệt mỏi khi nghe "pub / sub aka mô hình quan sát viên", chúng hoàn toàn không giống nhau. Pub / sub là một hệ thống sự kiện, mẫu quan sát sử dụng một hệ thống sự kiện để xuất bản các sự kiện TỰ ĐỘNG khi thay đổi đối tượng. Nếu bạn đang phát thủ công các sự kiện bất cứ khi nào bạn thay đổi một đối tượng, bạn không sử dụng mẫu quan sát viên.
BT

154

Có hai sự khác biệt chính giữa các mẫu Người quan sát / Quan sát và Nhà xuất bản / Người đăng ký:

  1. Mẫu quan sát / Quan sát chủ yếu được triển khai theo cách đồng bộ , tức là mẫu quan sát được gọi là phương thức thích hợp của tất cả các quan sát viên của nó khi một số sự kiện xảy ra. Mẫu Nhà xuất bản / Người đăng ký hầu hết được triển khai theo cách không đồng bộ (sử dụng hàng đợi tin nhắn).

  2. Trong mẫu Người quan sát / Quan sát , người quan sát nhận thức được có thể quan sát được . Trong khi đó, trong Nhà xuất bản / Người đăng ký , nhà xuất bản và người đăng ký không cần biết nhau . Họ chỉ đơn giản là giao tiếp với sự giúp đỡ của hàng đợi tin nhắn.

Như bạn đã đề cập một cách chính xác, ràng buộc dữ liệu là một thuật ngữ chung và nó có thể được thực hiện bằng phương pháp Observer / Observable hoặc Publisher / Thuê bao. Dữ liệu là Nhà xuất bản / Thuê bao.


7
Tôi đã đọc các ứng dụng web JavaScript của O'Reilly ( shop.oreilly.com/product/0636920018421.do ). Trong chương 2 Alex thực hiện một pub/subsử dụng sự kiện JS. Đây là một kiểu thực hiện gọi lại, nhưng nó là một ví dụ đồng bộ .
Jess

5
Tôi chưa đọc cuốn sách này nhưng nếu nó được triển khai bằng cách sử dụng "sự kiện" của JS, thì nó sẽ không đồng bộ vì các sự kiện không đồng bộ theo định nghĩa.
Tham số

3
Xin chào Jess, tất nhiên bạn đúng. Không có định nghĩa chuẩn cho các điều khoản này 😊
Param

14
Nói chung, một quan sát có một danh sách các nhà quan sát với nó (nó lặp lại danh sách này để gửi một sự kiện cho tất cả chúng). Một nhà xuất bản thường chỉ biết một hàng đợi nơi nó xuất bản các sự kiện / tin nhắn của mình. Nó không biết có bao nhiêu người tiêu dùng đã đăng ký vào hàng đợi đó.
Param

7
Đối với tôi, đây là sự khác biệt quan trọng giữa hai điều này: Ngoài ra, trong mô hình người quan sát, người quan sát nhận thức được sự quan sát được. Trong khi đó, trong Pub / Sub, cả nhà xuất bản và người tiêu dùng đều không cần biết nhau. Họ chỉ đơn giản là giao tiếp với sự giúp đỡ của hàng đợi tin nhắn. Câu trả lời chính xác!
maryonomead

23

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 objectcó 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ó observersListthành Objectnhư 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 eventsbạn đã xuất bản.


Vâng, đây là một câu trả lời tốt hơn, ngắn gọn và rõ ràng. :)
CoderX

Ở cấp độ cao, tôi luôn nói rằng sub pub là mẫu quan sát nhưng với mọi thứ nó có hương vị khác nhau.
Grim

9

Tôi đồng ý với kết luận của bạn về cả hai mẫu, tuy nhiên, đối với tôi, tôi sử dụng Observable khi tôi ở cùng một quy trình và tôi sử dụng Pub / Sub trong các tình huống liên quy trình, trong đó tất cả các bên chỉ biết kênh chung chứ không phải các bên .

Tôi không biết các mẫu khác, hoặc để tôi nói theo cách này, tôi chưa bao giờ cần các mẫu khác cho nhiệm vụ này. Ngay cả hầu hết các khung MVC và triển khai ràng buộc dữ liệu thường sử dụng khái niệm quan sát viên bên trong.

Nếu bạn quan tâm đến giao tiếp giữa các quá trình, tôi khuyên bạn:

"Các mô hình tích hợp doanh nghiệp: Thiết kế, xây dựng và triển khai các giải pháp nhắn tin" - http://www.addison-wesley.de/9780321200686.html

Cuốn sách này chứa rất nhiều ý tưởng về cách gửi tin nhắn giữa các quy trình hoặc lớp có thể được sử dụng ngay cả trong các tác vụ giao tiếp nội bộ (nó giúp tôi lập trình theo cách liên kết lỏng lẻo hơn).

Tôi hi vọng cái này giúp được!

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.