در دنیای اطرافمان یکسری سیستم ها برای آگاه سازی ساخته شدند.این سیستم ها یک مورد را تشخیص و به صاحبان خود اطلاع می دهند.
مثل سیستم های امنیتی و هشدار دزدگیر
یا سیستم های اطفاء حریق برای اطلاع و خاموش کردن آتش
خوبی این سیستم ها این است که یکپارچه هستند و می توان از آنها در جاهای دیگر استفاده کرد
یعنی یکبار این سیستم را پیاده می کنید و هر جا که خواستید استفاده می کنید!
این دیزاین پترن به شما این امکان را میدهد که یک شئ به نام (subject) و فهرست وابستگی هایش به نام (observers) را نگه دارید و هر اتفاقی که روی شئ افتاد را به ناظران خبر بدهید.
چندین نمایشی ها!
شاید تا به حال برای شما پیش آمده باشد که خواسته باشید تعداد سکه یا مقادیر دیگر را در چند منوی مختلف نشان دهید.پس از زیاد شدن سکه باید سیستمی باشد که تمام این مقادیر آپدیت شوند تا مثل هم باشند.
ساخت سیستم تغییر زبان
وقتی زبان عوض می شود باید به اطلاع تمام Text ها برسد که زبان عوض شده و مقادیر آنها ترجمه شود
ساخت سیستم Achievement
وقتی بازیکن یک کاری را انجام می دهد باید لیست دست آورد ها آپدیت شود تا دست آورد را کسب کند
ابتدا یک کلاس به نام Observer می سازیم و سپس یک تابع به نام OnNotify تعریف می کنیم تا هر شئ که از آن ارث می برد ملزم به پیاده سازی این تابع شود.
برای اینکه چنین سیستمی پیاده کنیم به لیستی از ناظران نیاز داریم تا آنها را Subscribe کنیم
همان طور که می بینید یک شئ (Subject ) و لیستی از ناظران (Observers) داریم:
حالا این تابع را در هر شئ که می خواهیم Subscribe کنیم پیاده می کنیم:
اگر با مفهوم pointer در زبان های c++/c آشنایی دارید در یک کلام بگم که delegate معادل pointer است.
و اگر آشنایی ندارید در یک جمله بگم که همون طور که از متغیر ها برای نگهداری داده ها استفاده می کنید از delegate برای نگهداری رفرنس توابع استفاده میشه و با استفاده از متد Invoke می تونید توابعش رو صدا بزنید.
ابتدا یک delegate تعریف می کنیم:
حالا رفرنس تابع را به Delegate اضافه می کنیم
اگر بخواهیم کد را خلاصه تر بکنیم می توانیم از Action استفاده کنیم
درواقع Action یک Delegate سادست!
اگر Action را دیکامپایل کنید به این موضوع پی می برید:
حال به کد قبلی باز می گردیم و به جای استفاده از delegate از شکل خلاصه آن یعنی Action استفاده می کنیم: