Observer pattern

Huy NguyenHuy Nguyen
3 min read

Chào các bạn, phần 2 trong series Design pattern mình muốn nói đến là Observer Pattern, mình nghĩ chắc chắn mọi người đã từng làm việc với pattern này nhưng không nhận ra nó. Ok bắt đầu luôn nhé.

Định nghĩa

Giả sử bạn lập trình Front end, bạn có một ô button, khi click button này, một số thành phần của giao diện sẽ thay đổi. Đây chính là lúc bạn vận dụng Observer pattern..

Observer pattern là một behavioral design pattern, định nghĩa mối quan hệ một-nhiều (one-to-many) giữa các đối tượng, trong đó một đối tượng (subject) giữ một danh sách các đối tượng phụ thuộc (observers) và tự động thông báo cho chúng về bất kỳ thay đổi nào trong trạng thái của mình, thường bằng cách gọi một phương thức của chúng

Các thành phần của Observer Pattern:

Article content

  • Publisher (Subject): đối tượng mà các observer đăng ký để nhận thông báo về các thay đổi trong trạng thái của nó.

  • Publisher có 3 hành động chính:

    • Subscribe: đăng kí 1 observer

    • Unsubscribe: hủy đăng kí 1 observer

    • NotifySubscriber: thông báo thay đổi trạng thái đến Subscriber

  • Subscriber (Observer): là đối tượng lắng nghe và nhận thông báo từ Publisher.

  • Update: phương thức trong Subscriber để “phản ứng” với những thay đổi từ Publisher

  • Concrete Subscriber: Các class kế thừa Subscriber, triển khai cụ thể phương thức Update

Ví dụ cụ thể

Hãy cùng tìm hiểu qua một ví dụ cụ thể: Một trạm khí tượng đo nhiệt độ và độ ẩm, mỗi khi trạm đo được dữ liệu thì cần xuất ngay các dữ liệu lên các màn hình khác nhau.

Ở đây, trạm khí tượng chính là Publisher và các màn hình hiển thị dữ liệu là Subscriber.

Trong đoạn code bên dưới, ta có các Interface IPublisher, ISubscriber, class WeatherData kế thừa IPublisher, và CurrentConditionDisplay kế thừa ISubscriber. Bên trong WeatherData có 1 mảng Subscribers lưu trữ các đối tượng đăng kí, phương thức SetMeasurements cập nhật các dữ liệu mới nhất và thông báo lại các thay đổi ngay lập tức đến các Subscriber qua phương thức Update.

Article content

Ví dụ cụ thể Observer Pattern

Khi nào thì dùng Observer Pattern

Đây là một pattern vô cùng linh hoạt và dễ triển khai, ít phức tạp, dùng khi một object thay đổi trạng thái sẽ cập nhật toàn bộ trạng thái của các object liên quan (nom giống 1 thư viện nào đó nhỉ). Observer làm giảm sự liên kết giữa các object (loose coupling), giúp cho việc mở rộng dễ dàng hơn. Tuy nhiên, Observer cũng có vài lưu ý như sau:

  • Không nên để hàm Update quá phức tạp, vì điều này ảnh hưởng đến độ trễ cập nhật trạng thái ở các Subscriber

  • Thứ tự nhận thông báo không đảm bảo như lúc đăng kí.

  • Với các use case phức tạp như truyền dữ liệu giữa các service thì mình đề xuất các giải pháp với Pub/Sub Message broker truyền thống.

Ứng dụng thực tế

Một ứng dụng thực tế của Observer Pattern chính là thư viện Redux trong lập trình frontend (quen không nào).

Ta có:

  • Store là Publisher

  • Các Component là Subscriber

  • Hàm subscribe() đăng kí các Component

  • State là dữ liệu trạng thái cập nhật thường xuyên

  • Reducer là hàm Update

Ngoài luồng về Observer pattern.

Observer pattern triển khai một số nguyên lý trong phát triển phần mềm nói chung và lập trình OOP nói riêng đó là Cố gắng giảm phụ thuộc giữa các object (Strive for loosely coupled designs between objects that interact) và Ưu tiên kết hợp hơn là kế thừa (Composition over inheritance). Những nguyên lí này xuất hiện hầu hết ở design pattern khác nhau, nếu bạn nắm chắc ý tưởng của các nguyên lý thì việc học và hiểu design pattern sẽ đơn giản hơn nhiều.

0
Subscribe to my newsletter

Read articles from Huy Nguyen directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Huy Nguyen
Huy Nguyen

I am a software engineer with 4 years of experience in developing web applications. My expertise lies in backend development, and I have a deep interest in problem-solving, algorithms, system design, and databases. I am always eager to learn and embrace challenging projects, striving to deliver applications that exceed user expectations. I also love sharing my knowledge and learning from others to foster mutual growth and improvement