Mẫu thiết kế Observer (Observer Pattern) là một trong những mẫu thiết kế hành vi nổi bật trong lập trình. Nó cho phép một đối tượng (gọi là subject hoặc observable) thông báo cho nhiều đối tượng khác (gọi là observers) về sự thay đổi trạng thái của nó. Mẫu này thường được sử dụng trong các tình huống mà một thay đổi trong một đối tượng cần được phản ánh đến các đối tượng khác mà không cần biết rõ về chúng.
Khi trạng thái của ConcreteSubject thay đổi, nó sẽ gọi phương thức thông báo tới tất cả các observer đã đăng ký. Các observer sau đó sẽ cập nhật bản thân mình theo trạng thái mới của subject.
Giả sử chúng ta đang phát triển một ứng dụng thời tiết, trong đó có một đối tượng chịu trách nhiệm cung cấp thông tin về nhiệt độ. Nhiều đối tượng khác (như bảng điều khiển thời tiết, ứng dụng di động, v.v.) cần được thông báo khi nhiệt độ thay đổi.
# Giao diện Observer class Observer: def update(self, temperature): pass # Giao diện Subject class Subject: def register_observer(self, observer: Observer): pass def remove_observer(self, observer: Observer): pass def notify_observers(self): pass # ConcreteSubject class WeatherStation(Subject): def __init__(self): self._observers = [] self._temperature = 0 def register_observer(self, observer: Observer): self._observers.append(observer) def remove_observer(self, observer: Observer): self._observers.remove(observer) def notify_observers(self): for observer in self._observers: observer.update(self._temperature) def set_temperature(self, temperature): self._temperature = temperature self.notify_observers() # ConcreteObserver class WeatherDisplay(Observer): def update(self, temperature): print(f"Updated temperature: {temperature}°C") # Sử dụng mẫu thiết kế Observer if __name__ == "__main__": # Tạo subject weather_station = WeatherStation() # Tạo observers display1 = WeatherDisplay() display2 = WeatherDisplay() # Đăng ký observers weather_station.register_observer(display1) weather_station.register_observer(display2) # Thay đổi nhiệt độ và thông báo cho các observers weather_station.set_temperature(25) weather_station.set_temperature(30)
update
mà các observer sẽ thực hiện.notify_observers
để thông báo cho tất cả các observer.update
để nhận thông báo và in ra nhiệt độ mới.WeatherStation
và hai đối tượng WeatherDisplay
. Đăng ký các display với weather station. Khi nhiệt độ thay đổi, cả hai display sẽ nhận được thông báo và in ra nhiệt độ mới.Mẫu thiết kế Observer là một công cụ mạnh mẽ trong lập trình, cho phép xây dựng các hệ thống có khả năng phản ứng với sự thay đổi một cách linh hoạt. Việc sử dụng mẫu này không chỉ giúp giảm sự phụ thuộc giữa các thành phần trong hệ thống mà còn dễ dàng mở rộng trong tương lai. Hy vọng bài viết này đã cung cấp cho bạn cái nhìn sâu sắc về Observer Pattern và cách áp dụng nó trong các dự án thực tế. Nếu bạn có bất kỳ câu hỏi nào hoặc cần thêm thông tin, hãy cho tôi biết!