Observer pattern là một Design Pattern mà một đối tượng, gọi là subject, duy trì một danh sách các thành phần phụ thuộc nó, gọi là observer, và thông báo tới chúng một cách tự động về bất cứ thay đổi nào, thường thì bằng cách gọi 1 hàm của chúng.
Định nghĩa mối phụ thuộc một - nhiều giữa các đối tượng để khi mà một đối tượng có sự thay đổi trạng thái, tất các thành phần phụ thuộc của nó sẽ được thông báo và cập nhật một cách tự động. Một đối tượng có thể thông báo đến một số lượng không giới hạn các đối tượng khác.
Giả sử chúng ta có một bảng tính excel với nhiều trang tính chứa các dữ liệu cần để thống kê. Ta có thể tạo ra vô số biểu đồ sử dụng dữ liệu ở các trang tính đó để hiển thị ra kết quả thống kê. Khi ta thay đổi dữ liệu ở một trang tính, các biểu đồ có sử dụng dữ liệu đó cũng phải được cập nhật để có số liệu thống kê chính xác. Ta có thể thấy là số lượng biểu đồ có thể dùng dữ liệu ở một trang tính là không giới hạn. Và hướng giải quyết khi sử dụng Observer pattern: trang tính ở đây đóng vai trò là subject, còn các biểu đồ chính là các observer. Mỗi khi trang tính được cập nhật dữ liệu, ta sẽ gọi cập nhật đến các biểu đồ phụ thuộc dữ liệu với trang tính đó.
Observer Pattern được áp dụng khi:
Subject
Observer
ConcreteSubject
ConcreteObserver
Ta có thể hình dung sự tương tác giữa subject và các observer như sau:
Chúng ta cài đặt các class, interface như sau:
// Observer.java
public interface Observer {
public void update(String mesage);
}
// Subject.java
public class Subject {
private List<Observer> observers = new List<Observer>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyChange(String message) {
for(Observer observer : observers) {
observer.update(message)
}
}
}
// Main.java
public class Main {
public static void main(String[] args) {
Subject subject = new Subject();
Observer observer1 = new Observer() {
public void update(String message) {
System.out.println("Message 1 changed: " + message);
}
}
subject.attach(observer1);
Observer observer2 = new Observer() {
public void update(String message) {
System.out.println("Message 2 changed: " + message);
}
}
subject.attach(observer2);
subject.notifyChange("Test change state 1");
subject.detach(observer1);
subject.notifyChange("Test change state 2");
}
}
Và kết quả khi chạy chương trình:
Trên đây là những kiến thức mình đã tìm hiểu được về Design Pattern Observer, hy vọng sẽ giúp ích được phần nào đó cho những ai đang muốn tìm hiểu về Design pattern này. Nếu thấy bài viết của mình chưa được đúng, hãy giúp mình bằng cách thêm nhận xét vào phần comment bên dưới nhé. Cảm ơn bạn đã quan tâm đến bài viết.
Unpublished comment
Viết câu trả lời