- vừa được xem lúc

Observer Pattern trong Java

0 0 3

Người đăng: Ông Huy Thắng

Theo Viblo Asia

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.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tổng hợp các bài hướng dẫn về Design Pattern - 23 mẫu cơ bản của GoF

Link bài viết gốc: https://gpcoder.com/4164-gioi-thieu-design-patterns/. Design Patterns là gì. Design Patterns không phải là ngôn ngữ cụ thể nào cả.

0 0 317

- vừa được xem lúc

Giới thiệu về Builder Design Pattern

Nguồn: refactoring.guru. Builder. Ý đồ.

0 0 50

- vừa được xem lúc

Một ví dụ nhỏ về Factory method

Trong bài viết trước mình đã giới thiệu tới các bạn về Abstract Factory pattern, các bạn quan tâm có thể theo dõi lại tại đây. Để tiếp tục về chủ đề design pattern trong bài viết này mình sẽ trình bày những khái niệm, ưu nhược điểm và các sử dụng của một creational design pattern khác đó là Factory

0 0 42

- vừa được xem lúc

Tôi đã dùng Service Pattern trong NuxtJS như thế nào ?

Giới thiệu. Trong quá trình làm VueJS NuxtJS hay thậm chí là Laravel mình cũng hay áp dụng các pattern như Service hoặc Repository.

0 0 76

- vừa được xem lúc

Hướng dẫn Adapter Design Pattern

Trong bài viết này, chúng ta sẽ cùng tìm hiểu về Adapter Design Pattern qua cấu trúc, cánh triển khai, ví dụ, ưu điểm nhược điểm và ứng dụng của nó. Đây là bài viết đầu tiên của mình nên sẽ không trán

1 1 72

- vừa được xem lúc

Giới thiệu về Prototype Design Pattern

Ý đồ. Prototype là một creational design pattern cho phép bạn sao chép các object hiện có mà không làm cho code của bạn phụ thuộc vào các class của chúng.

0 0 56