From a51257fd7992c2435c2aa62fc18ceeeecd366e54 Mon Sep 17 00:00:00 2001 From: PhucVR <59957741+nguyenphuc22@users.noreply.github.com> Date: Wed, 6 Dec 2023 19:56:33 +0700 Subject: [PATCH] Update Observer Pattern --- .idea/workspace.xml | 15 +------- Writerside/hi.tree | 1 + Writerside/topics/Observer.md | 66 +++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 14 deletions(-) create mode 100644 Writerside/topics/Observer.md diff --git a/.idea/workspace.xml b/.idea/workspace.xml index c30515b..b5187c5 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,7 +5,7 @@ - + @@ -67,19 +67,6 @@ "RunOnceActivity.ShowReadmeOnStart": "true", "git-widget-placeholder": "main", "last_opened_file_path": "/Users/phucnguyen/Documents/GitHub/Design-Patterns/Writerside/topics" - }, - "keyToStringList": { - "stardust.markdown.MarkdownSplitEditorSuppressor:keyList": [ - "/Users/phucnguyen/Documents/GitHub/Design-Patterns/Writerside/topics/Behavioral-Patterns.md", - "/Users/phucnguyen/Documents/GitHub/Design-Patterns/Writerside/topics/Chain-Of-Responsibility.md", - "/Users/phucnguyen/Documents/GitHub/Design-Patterns/Writerside/topics/Command.md", - "/Users/phucnguyen/Documents/GitHub/Design-Patterns/Writerside/topics/Creational-Patterns.md", - "/Users/phucnguyen/Documents/GitHub/Design-Patterns/Writerside/topics/Decorator.md", - "/Users/phucnguyen/Documents/GitHub/Design-Patterns/Writerside/topics/Intro.md", - "/Users/phucnguyen/Documents/GitHub/Design-Patterns/Writerside/topics/Iterator.md", - "/Users/phucnguyen/Documents/GitHub/Design-Patterns/Writerside/topics/Mediator.md", - "/Users/phucnguyen/Documents/GitHub/Design-Patterns/Writerside/topics/Structural-Patterns.md" - ] } }]]> diff --git a/Writerside/hi.tree b/Writerside/hi.tree index 262c5a1..f11d2d8 100644 --- a/Writerside/hi.tree +++ b/Writerside/hi.tree @@ -30,5 +30,6 @@ + \ No newline at end of file diff --git a/Writerside/topics/Observer.md b/Writerside/topics/Observer.md new file mode 100644 index 0000000..4fe7b15 --- /dev/null +++ b/Writerside/topics/Observer.md @@ -0,0 +1,66 @@ +# Observer + +## Giới thiệu + +Observer Pattern định nghĩa mối 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, các đối tượng phụ thuộc vào nó sẽ được thông báo và cập nhật. + +## Định nghĩa + +Observer Pattern mô tả mối quan hệ giữa các đối tượng theo mô hình phát trực tiếp (publish-subscribe), trong đó có một đối tượng (subject) sẽ "báo cáo" sự thay đổi trạng thái của nó tới các đối tượng đăng ký quan sát (observer) để chúng cập nhật. + +## Mục đích + +- Định nghĩa mối 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 đối tượng phụ thuộc vào nó sẽ được thông báo và cập nhật. + +## Đặt vấn đề + +Giả sử bạn đang phát triển một website thương mại điện tử với các chức năng sau: + +- Người dùng có thể đăng ký nhận thông báo khi một sản phẩm nào đó có giá giảm. + +- Khi giá sản phẩm thay đổi, tất cả người dùng đã đăng ký sẽ nhận được thông báo. + +Làm thế nào để triển khai khi có hàng triệu người dùng cùng theo dõi hàng triệu sản phẩm khác nhau? + +## Giải quyết + +Observer Pattern được áp dụng như sau: + +- Định nghĩa một Subject (đối tượng chủ đề) đại diện cho sản phẩm. + +- Người dùng (Observer) có thể đăng ký theo dõi Subject. + +- Khi trạng thái của Subject thay đổi (giá sản phẩm) thì sẽ thông báo tới tất cả Observer đã đăng ký. + +![](https://refactoring.guru/images/patterns/diagrams/observer/structure.png) + +## Cấu trúc + +Các thành phần trong Observer Pattern: + +- Subject: đối tượng chủ thể cần theo dõi. Nó duy trì danh sách các Observer và thông báo cho chúng khi trạng thái thay đổi. + +- Observer: đối tượng quan sát Subject. Nó đăng ký theo dõi Subject và cập nhật khi nhận được thông báo từ Subject. + +- ConcreteSubject và ConcreteObserver: các cài đặt cụ thể. + +## Cách triển khai + +Để triển khai Observer Pattern trong Java, có thể: + +- Sử dụng interface java.util.Observable và java.util.Observer. +- Tự định nghĩa Subject, Observer interface và các cài đặt tương ứng. + +## Ví dụ + +// Ví dụ đăng ký nhận thông báo khi giá sản phẩm thay đổi + +## So sánh + +So với PubSub, Observer tập trung vào mối quan hệ giữa các object, còn PubSub tập trung vào việc truyền thông điệp. + +## Kết luận + +Observer Pattern thích hợp để xây dựng các chức năng thông báo sự kiện trong hệ thống. Tuy nhiên cũng cần tránh lạm dụng và làm phức tạp hóa code. \ No newline at end of file