Как описать паттерн Наблюдатель (Observer)?
Этот вопрос проверяет знание паттерна Наблюдатель, который используется для уведомления объектов о изменениях состояния другого объекта.
Короткий ответ
Паттерн Наблюдатель — это поведенческий паттерн проектирования, в котором объект (субъект) уведомляет другие объекты (наблюдатели) о изменении своего состояния. Это полезно для реализации систем обработки событий. В PHP паттерн Наблюдатель может быть реализован с помощью интерфейсов SplObserver и SplSubject из стандартной библиотеки.
Длинный ответ
Паттерн Наблюдатель используется для создания системы, где один объект (субъект) уведомляет другие объекты (наблюдателей) о своих изменениях, не зная, кто эти наблюдатели. Это идеальный паттерн для реализации событийных систем или подписки на изменения состояния.
Основные компоненты паттерна:
- Субъект (Subject): Это объект, который хранит состояние и уведомляет наблюдателей о его изменении.
- Наблюдатель (Observer): Это объект, который слушает изменения состояния субъекта и реагирует на эти изменения.
Пример реализации в PHP:
interface Observer {
public function update($data);
}
class User implements Observer {
public function update($data) {
echo "User notified with data: " . $data;
}
}
class RoleChange implements SplSubject {
private $observers = [];
private $role;
public function attach(SplObserver $observer) {
$this->observers[] = $observer;
}
public function detach(SplObserver $observer) {
$this->observers = array_filter($this->observers, function($obs) use ($observer) {
return $obs !== $observer;
});
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update($this->role);
}
}
public function setRole($role) {
$this->role = $role;
$this->notify();
}
}
Паттерн Наблюдатель полезен для создания событийных систем, где изменения одного объекта уведомляют другие. В PHP для его реализации можно использовать встроенные интерфейсы SplObserver и SplSubject.