The before code shows manual UI refresh calls after data changes, risking missed updates. The after code implements the observer pattern where UIComponent subscribes to Subject. When Subject's data changes, it notifies UIComponent automatically to update, ensuring consistent UI refresh.
### Before: Without Observer Pattern
class DataModel:
def __init__(self):
self.data = None
class UIComponent:
def __init__(self, model):
self.model = model
def refresh(self):
print(f"UI refreshed with data: {self.model.data}")
model = DataModel()
ui = UIComponent(model)
# Manual update required
model.data = 'New Data'
ui.refresh()
### After: With Observer Pattern
class Subject:
def __init__(self):
self._observers = []
self._data = None
def subscribe(self, observer):
self._observers.append(observer)
def unsubscribe(self, observer):
self._observers.remove(observer)
@property
def data(self):
return self._data
@data.setter
def data(self, value):
self._data = value
self._notify()
def _notify(self):
for observer in self._observers:
observer.update(self._data)
class Observer:
def update(self, data):
pass
class UIComponent(Observer):
def update(self, data):
print(f"UI refreshed with data: {data}")
model = Subject()
ui = UIComponent()
model.subscribe(ui)
model.data = 'New Data'