دیزاین پترن بعدی
Observer که به معنی مشاهده گر هست.دیزاین پترن
Observer برای برقراری ارتباط بین اجزای نرمافزار به منظور رصد و پاسخ به تغییرات استفاده میشود. در این الگو، یک شئ ارائه دهنده اطلاعات مرتبط (مشترک) به تعدادی از شئ های مشاهدهکننده وابسته است. وقتی که وضعیت شئ ارائه دهنده اطلاعات تغییر میکند، تمام شئ های مشاهدهکننده مطلع میشوند و عملیاتی را براساس تغییرات انجام میدهند.در دیزاین پترن
Observer، ارتباط بین ارائه دهنده اطلاعات (موضوع) و شئ های مشاهدهکننده (مشترکین) به وسیله رابط یا کلاسی که شئ های مشاهدهکننده را نگهداری میکند (مشترککننده) برقرار میشود.مثال:
interface Observer {
public function update($data);
}
class Subject {
private $observers = [];
public function attach(Observer $observer) {
$this->observers[] = $observer;
}
public function detach(Observer $observer) {
$index = array_search($observer, $this->observers);
if ($index !== false) {
unset($this->observers[$index]);
}
}
public function notify($data) {
foreach ($this->observers as $observer) {
$observer->update($data);
}
}
}
class ConcreteObserver implements Observer {
public function update($data) {
echo "Received data: " . $data . "\n";
}
}
در مثال بالا، اینترفیس Observer تعریف شده است که تابع update را میشود پیادهسازی کرد. سپس کلاس Subject ایجاد شده است که شئ های Observer را نگهداری میکند. متد attach برای اضافه کردن شئ های Observer، متد detach برای حذف آنها و متد notify برای اطلاعرسانی تغییرات به تمام Observer ها استفاده میشود.همچنین، یک کلاس مشترککننده
ConcreteObserver تعریف شده است که روش update را پیادهسازی میکند. وقتی که تغییری در Subject رخ میدهد و تابع notify فراخوانی میشود، تمام مشترککنندهها (شئ های Observer) به طور خودکار تابع update را اجرا کرده و تغییرات را دریافت میکنند.$subject = new Subject();Result:
$observer1 = new ConcreteObserver();
$subject->attach($observer1);
$observer2 = new ConcreteObserver();
$subject->attach($observer2);
$subject->notify("Hello Banana!");
Received data: Hello Banana!
Received data: Hello Banana!
در مثال بالا، ابتدا یک شئ
Subject ایجاد شده و دو شئ ConcreteObserver به آن الحاق شدهاند. سپس با فراخوانی تابع notify روی Subject و ارسال پیام Hello Banana!، تمام مشترککنندهها این پیام را دریافت و نمایش میدهند.دیزاین پترن
Observer زمانی مفید است که یک تغییر در یک شئ منجر به تغییراتی در شئ های دیگر میشود و ارتباط ضعیف بین اجزا مد نظر است. این الگو باعث جداسازی اجزا و افزایش انعطافپذیری در نرمافزار میشود..