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