Bạn có bao giờ gặp tình huống khi bạn muốn được thông báo mỗi khi có sự thay đổi đối với một cái gì đó? Trong trường hợp này, Observer Pattern (Mẫu Quan sát) có thể là giải pháp tốt nhất để xử lý. Pattern này giúp tạo ra mối quan hệ one-to-many giữa các đối tượng, cho phép một đối tượng thông báo cho nhiều đối tượng khác về sự thay đổi của mình.
Tạo một môi trường quan sát
Hãy tưởng tượng rằng bạn là một nhân viên công ty, và sếp của bạn muốn được thông báo mỗi khi có sự thay đổi trong cơ sở dữ liệu của công ty. Bạn cũng đồng ý rằng bạn và khách hàng cũng nên được thông báo về những thay đổi này. Đó là khi Observer Pattern trở nên hữu ích.
Observer Pattern cho phép bạn đăng ký sự thay đổi với một đối tượng gốc (thường được gọi là Subject) và chỉ ra những người nhận thông báo về mọi sự thay đổi. Trong trường hợp này, Subject chính là cơ sở dữ liệu của công ty.
Quy trình hoạt động của Observer Pattern
Observer cần phải đăng ký với Subject, tức là cơ sở dữ liệu. Khi có bất kỳ thay đổi nào trong cơ sở dữ liệu, subject sẽ thông báo cho tất cả các observer đã đăng ký. Mỗi observer có thể hủy đăng ký bất cứ khi nào muốn.
Hãy cùng xem một ví dụ cụ thể về cách hoạt động của Observer Pattern:
Ví dụ: Vận hành trong một công ty
Trong ví dụ này, chúng ta có một công ty với cơ sở dữ liệu riêng. Đối tượng Database sẽ đóng vai trò là Subject, và sếp, các lập trình viên và khách hàng sẽ đóng vai trò là các Observer. Mỗi khi có sự thay đổi trong cơ sở dữ liệu, Subject sẽ thông báo cho tất cả các Observer đã đăng ký về sự thay đổi này.
Quy trình hoạt động của Observer Pattern như sau:
- Observer đăng ký với Subject (Database).
- Database lưu trữ thông tin về các Observer đã đăng ký.
- Khi có sự thay đổi trong cơ sở dữ liệu, Database thông báo (notify) đến tất cả các Observer đã đăng ký.
- Mỗi Observer nhận thông báo và xử lý theo cách riêng của mình.
Observer Pattern cho phép các Observer đăng ký và hủy đăng ký vào bất kỳ thời điểm nào, giúp hệ thống linh hoạt và dễ dàng mở rộng.
Áp dụng Observer Pattern
Trong Observer Pattern, chúng ta cần phải định nghĩa một giao diện cho Subject và Observer để chúng có thể làm việc với nhau. Điều này giúp các lớp giữ mối quan hệ rõ ràng với nhau và dễ dàng bảo trì và mở rộng hệ thống.
Dưới đây là một số bước để áp dụng Observer Pattern:
- Định nghĩa giao diện cho Subject và Observer.
- Tạo lớp thực hiện giao diện Subject (trong ví dụ này, lớp Database).
- Subject cần cho phép Observer đăng ký, hủy đăng ký và nhận thông báo khi có sự thay đổi.
- Đối tượng Subject sẽ lưu trữ thông tin về các Observer đã đăng ký.
- Khi có sự thay đổi, Subject sẽ thông báo cho tất cả các Observer đã đăng ký.
Dưới đây là một ví dụ về mã lớp giả định trong Observer Pattern:
// Định nghĩa giao diện Subject
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// Định nghĩa giao diện Observer
interface Observer {
void update();
}
// Tạo lớp Database thực hiện giao diện Subject
class Database implements Subject {
private ArrayList observers;
public Database() {
this.observers = new ArrayList<>();
}
public void registerObserver(Observer observer) {
this.observers.add(observer);
}
public void removeObserver(Observer observer) {
this.observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
Với Observer Pattern, bạn có thể loại bỏ sự phụ thuộc và kết nối chặt chẽ giữa các đối tượng trong hệ thống. Điều này giúp giảm thiểu sự phụ thuộc và làm cho hệ thống dễ bảo trì và mở rộng hơn.
Observer Pattern là một mẫu thiết kế mạnh mẽ giúp tổ chức quan sát và thông báo tự động giữa các đối tượng. Nó cho phép một đối tượng thông báo cho nhiều đối tượng khác về sự thay đổi của mình, giúp tạo ra sự linh hoạt và mở rộng trong hệ thống.
Hãy áp dụng Observer Pattern vào các dự án của bạn để tận dụng lợi ích của mẫu thiết kế này và tạo ra những sản phẩm chất lượng và dễ bảo trì.