TGViewer
| AmirHossein | | AmirHossein | @amirhdeveloper · 610 subscribers
Post #71 187
#design_patterns
دیزاین پترن بعدی 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();

$observer1 = new ConcreteObserver();
$subject->attach($observer1);

$observer2 = new ConcreteObserver();
$subject->attach($observer2);

$subject->notify("Hello Banana!");

Result:
Received data: Hello Banana!
Received data: Hello Banana!

در مثال بالا، ابتدا یک شئ Subject ایجاد شده و دو شئ ConcreteObserver به آن الحاق شده‌اند. سپس با فراخوانی تابع notify روی Subject و ارسال پیام Hello Banana!، تمام مشترک‌کننده‌ها این پیام را دریافت و نمایش می‌دهند.

دیزاین پترن Observer زمانی مفید است که یک تغییر در یک شئ منجر به تغییراتی در شئ های دیگر می‌شود و ارتباط ضعیف بین اجزا مد نظر است. این الگو باعث جداسازی اجزا و افزایش انعطاف‌پذیری در نرم‌افزار می‌شود.
.
  • 👍 2
More from @amirhdeveloper
  1. Oct 7, 2026بیاید از قدرت های لاراگرام بگم لاراگرام یک full-stack و ai-ready فریمورک برای توسعه ربات ه…
  2. Sep 30, 2026پکیج LaraGram Sentinel منتشر شد؛ یک پنل مانیتورینگ که هیچ چیزی از زیر دستش در نمی‌ره! تمام…
  3. Sep 23, 2026از امروز با کاهش شدید حاکرها مواجه میشیم
  4. Sep 19, 2026🔴 سوال سوم دو Region دارید: US-East و EU-West. کاربران در هر دو Region هستند. سیستم باید…
  5. Sep 19, 2026🟠 سوال دوم فرض کنید Service A به Service B درخواست می‌زند. B به‌دلیل overload، latency با…
  6. Sep 19, 2026🟢 سوال اول فرض کنید یک سرویس backend داریم که به PostgreSQL وصل می‌شود. تعداد requestها ن…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →