Design Pattern Observer là một mẫu thiết kế thuộc nhóm Behavioral Patterns (hành vi), cho phép một đối tượng (gọi là Subject hoặc Observable) thông báo đến các đối tượng khác (Observers) khi trạng thái của nó thay đổi. Điều này giúp tách biệt giữa các thành phần, tăng tính mở rộng và giảm sự phụ thuộc lẫn nhau.
Cơ bản về Observer Pattern
Các thành phần chính::
- Subject (Observable): Đối tượng chính bị theo dõi, khi có thay đổi sẽ thông báo đến các observer.
- Observer: Đối tượng lắng nghe và phản ứng khi subject thay đổi.
- ConcreteSubject: Cài đặt cụ thể của Subject.
- ConcreteObserver: Cài đặt cụ thể của Observer.
interface Observer { void update(String message);
} class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } public void update(String message) { System.out.println(name + " received update: " + message); }
} class Subject { private List<Observer> observers = new ArrayList<>(); public void addObserver(Observer o) { observers.add(o); } public void notifyObservers(String message) { for (Observer o : observers) { o.update(message); } } public void changeState(String newState) { // logic nào đó... notifyObservers(newState); }
}
Áp dụng Observer Pattern trong Spring Boot
Trong Spring, pattern này được hỗ trợ sẵn thông qua cơ chế Application Event:
Cách hoạt động:
- Event Publisher (Subject): phát một sự kiện.
- Event Listener (Observer): lắng nghe và xử lý sự kiện.
Bước 1: Tạo một sự kiện
public class UserCreatedEvent extends ApplicationEvent { private final String email; public UserCreatedEvent(Object source, String email) { super(source); this.email = email; } public String getEmail() { return email; }
}
Bước 2: Tạo listener cho sự kiện
@Component
public class SendWelcomeEmailListener { @EventListener public void handleUserCreated(UserCreatedEvent event) { System.out.println("Sending welcome email to " + event.getEmail()); }
}
Bước 3: Publish sự kiện
@Service
public class UserService { private final ApplicationEventPublisher eventPublisher; public UserService(ApplicationEventPublisher eventPublisher) { this.eventPublisher = eventPublisher; } public void createUser(String email) { // logic tạo user... // Gửi sự kiện eventPublisher.publishEvent(new UserCreatedEvent(this, email)); }
}
Ưu điểm khi dùng Observer (Event) trong Spring
- Decoupling: Code không bị ràng buộc giữa nơi phát và nơi xử lý.
- Mở rộng dễ dàng: Thêm listener mới mà không cần sửa source code cũ.
- Dễ test: Các thành phần nhỏ gọn, có thể test độc lập.