Mẫu thiết kế quan sát giống như một podcast

Nếu bạn nghe podcast, bạn đã quen thuộc với mẫu Observer. Trên thực tế, bạn là một người quan sát người Viking.

Đây là định nghĩa cho mẫu Observer:

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

Hãy cùng xem các định nghĩa liên quan đến podcast.

Tôi tìm thấy một podcast thú vị có tên là nhà phát triển trà.

Sau khi nhấp vào nút SUBSCRIBE, tôi hiện tại trong danh sách người đăng ký của họ.

Khi nhà phát triển trà phát hành một tập phim mới, ứng dụng sẽ thông báo cho tôi và những người đăng ký khác. Nó tải tập mới cho chúng tôi.

Đó chính xác là định nghĩa của mẫu Người quan sát!

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

Có một mối quan hệ một-nhiều giữa podcast trà nhà phát triển và người đăng ký.

Khi nhà phát triển trà thay đổi trạng thái, chẳng hạn như phát hành tập mới, tất cả những người đăng ký của nhà phát triển sẽ được thông báo và cập nhật.

Hãy để thực hiện nó trong Ruby.

Bắt đầu với một phiên bản đơn giản.

Lớp Podcast chứa một danh sách các tập và có một phương thức để add_epiT vào danh sách.

Sau đó, chúng ta có thể tạo podcast developer_tea và thêm tập 1 vào nó như thế này:

Tôi muốn nhận thông báo mỗi khi tập mới được phát hành.

Chúng tôi có thể cập nhật cho tôi sau khi thêm tập mới vào danh sách:

Và bất cứ khi nào tôi nhận được bản cập nhật từ developer_tea, tôi có thể tiếp tục và tải xuống tập mới nhất.

Tôi thích nghe developer_tea đến mức tôi giới thiệu nó với bạn của tôi, Amber. Bây giờ, Amber cũng muốn đăng ký nó.

Chúng tôi cần đảm bảo Amber cũng nhận được thông báo mỗi khi tập mới được phát hành:

Hmmm, mã này làm những gì chúng ta muốn.

Nhưng có một vấn đề.

Mỗi lần chúng tôi muốn thêm một thuê bao, chúng tôi phải xác định lại lớp.

Có cách nào để cập nhật danh sách người đăng ký mà không phải xác định lại lớp không?

Chúng tôi có thể giữ một danh sách người đăng ký!

Lớp Podcast mới giữ một danh sách người đăng ký với sự trợ giúp của hai phương thức mới: một để thêm người đăng ký và một để xóa người đăng ký. Khi một tập được phát hành, chúng tôi cập nhật từng người đăng ký.

Thật không may, Amber không thích podcast nhiều như tôi và quyết định hủy đăng ký. Chúng tôi sử dụng phương thức remove_subscacker để xóa cô ấy khỏi danh sách người đăng ký.

Yay! Bạn vừa học được mẫu Người quan sát!

Nguyên tắc thiết kế đằng sau mẫu Observer.

Mẫu Observer sử dụng nguyên tắc thiết kế Loose Coupling:

Phấn đấu cho các thiết kế liên kết lỏng lẻo giữa các đối tượng tương tác.

Lớp Podcast không có nhiều người biết về các thuê bao của mình. Nó chỉ biết mỗi thuê bao có một phương thức cập nhật.

Khớp nối lỏng lẻo này giảm thiểu sự phụ thuộc giữa Podcast và các thuê bao của nó. Nó cũng tối đa hóa sự linh hoạt. Miễn là nó có một phương thức cập nhật, một thuê bao có thể là bất cứ thứ gì: một con người, một nhóm người, một con vật hoặc thậm chí là một chiếc xe hơi.

Hành trình:

  1. Mẫu quan sát xác định một phụ thuộc một-nhiều giữa các đối tượng để khi một đối tượng thay đổi trạng thái, tất cả các phụ thuộc của nó được thông báo và cập nhật tự động.
  2. Nguyên tắc thiết kế khớp nối lỏng lẻo: phấn đấu cho các thiết kế ghép lỏng lẻo giữa các đối tượng tương tác.

Cảm ơn vì đã đọc. Có bất kỳ ví dụ thực tế nào khác về mẫu Người quan sát mà bạn có thể nghĩ đến không?

Tôi xuất bản lên sihui.io hàng tuần.

Theo dõi để bạn giành chiến thắng bỏ lỡ bài viết tiếp theo từ loạt bài.

Lần sau chúng ta sẽ nói về Lọ