Observer Pattern là một trong những design pattern thuộc nhóm Behavioral Patterns (mẫu hành vi), được sử dụng để tạo ra mối quan hệ 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 của nó sẽ được thông báo và tự động cập nhật.
Trong Observer Pattern, có hai thành phần chính:
Observer Pattern hữu ích trong các tình huống mà bạn muốn duy trì tính đồng bộ giữa các đối tượng, đặc biệt là khi có sự thay đổi trạng thái từ một nguồn duy nhất nhưng có nhiều thành phần khác nhau cần cập nhật theo.
Ví dụ phổ biến của Observer Pattern bao gồm:
Quá trình làm việc của Observer Pattern có thể được mô tả qua các bước sau:
// Interface Observer public interface Observer { void update(String message); } // Concrete Observer public class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } @Override public void update(String message) { System.out.println(name + " nhận thông báo: " + message); } } // Interface Subject public interface Subject { void addObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } // Concrete Subject import java.util.ArrayList; import java.util.List; public class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); private String message; @Override public void addObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(message); } } public void setMessage(String message) { this.message = message; notifyObservers(); } } // Sử dụng Observer Pattern public class Main { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); Observer observer1 = new ConcreteObserver("Observer 1"); Observer observer2 = new ConcreteObserver("Observer 2"); subject.addObserver(observer1); subject.addObserver(observer2); subject.setMessage("Trạng thái mới"); } }
update
để các đối tượng có thể thực hiện hành động khi nhận được thông báo từ Subject.notifyObservers
để gửi thông báo đến tất cả các Observer đã đăng ký.main
, chúng ta tạo ra đối tượng Subject và đăng ký một vài Observer, sau đó thay đổi trạng thái của Subject và các Observer được thông báo về sự thay đổi đó.Observer Pattern rất hữu ích trong các trường hợp cần một cơ chế cập nhật tự động giữa nhiều đối tượng phụ thuộc vào nhau. Nó giúp giảm thiểu sự kết nối chặt chẽ giữa các đối tượng, từ đó tăng tính linh hoạt và khả năng mở rộng của hệ thống.