دیزاین پترن Observer در یونیتی

مقدمه

در دنیای اطرافمان یکسری سیستم ها برای آگاه سازی ساخته شدند.این سیستم ها یک مورد را تشخیص و به صاحبان خود اطلاع می دهند.


مثل سیستم های امنیتی و هشدار دزدگیر

یا سیستم های اطفاء حریق برای اطلاع و خاموش کردن آتش

خوبی این سیستم ها این است که یکپارچه هستند و می توان از آنها در جاهای دیگر استفاده کرد

یعنی یکبار این سیستم را پیاده می کنید و هر جا که خواستید استفاده می کنید!

دیزاین پترن Observer

این دیزاین پترن به شما این امکان را میدهد که یک شئ به نام (subject) و فهرست وابستگی هایش به نام (observers) را نگه دارید و هر اتفاقی که روی شئ افتاد را به ناظران خبر بدهید.

کاربرد دیزاین پترن Observer در یونیتی

چندین نمایشی ها!

شاید تا به حال برای شما پیش آمده باشد که خواسته باشید تعداد سکه یا مقادیر دیگر را در چند منوی مختلف نشان دهید.پس از زیاد شدن سکه باید سیستمی باشد که تمام این مقادیر آپدیت شوند تا مثل هم باشند.

ساخت سیستم تغییر زبان

وقتی زبان عوض می شود باید به اطلاع تمام Text ها برسد که زبان عوض شده و مقادیر آنها ترجمه شود


ساخت سیستم Achievement

وقتی بازیکن یک کاری را انجام می دهد باید لیست دست آورد ها آپدیت شود تا دست آورد را کسب کند


پیاده سازی Observer در یونیتی

ابتدا یک کلاس به نام Observer می سازیم و سپس یک تابع به نام OnNotify تعریف می کنیم تا هر شئ که از آن ارث می برد ملزم به پیاده سازی این تابع شود.

https://gist.github.com/smkplus/a20fe45b36e88d440acb0cb4c2ba30a3


برای اینکه چنین سیستمی پیاده کنیم به لیستی از ناظران نیاز داریم تا آنها را Subscribe کنیم

همان طور که می بینید یک شئ (Subject ) و لیستی از ناظران (Observers) داریم:

https://gist.github.com/smkplus/6fef0686fdd36cdd6bb464bbaf24f54b


حالا این تابع را در هر شئ که می خواهیم Subscribe کنیم پیاده می کنیم:

https://gist.github.com/smkplus/f5485a40665ed0f5722ae070fd2e73a7
همان طور که می بینید پیام برای ناظران ارسال شد
همان طور که می بینید پیام برای ناظران ارسال شد


تعریف Delegate

اگر با مفهوم pointer در زبان های c++/c آشنایی دارید در یک کلام بگم که delegate معادل pointer است.

و اگر آشنایی ندارید در یک جمله بگم که همون طور که از متغیر ها برای نگهداری داده ها استفاده می کنید از delegate برای نگهداری رفرنس توابع استفاده میشه و با استفاده از متد Invoke می تونید توابعش رو صدا بزنید.

استفاده از Delegate برای پیاده سازی Observer

ابتدا یک delegate تعریف می کنیم:

https://gist.github.com/smkplus/5d72699c6251e06d62d363208b83746a

حالا رفرنس تابع را به Delegate اضافه می کنیم

https://gist.github.com/smkplus/71ca6bf19f9a9c45492717e575eec24c

اگر بخواهیم کد را خلاصه تر بکنیم می توانیم از Action استفاده کنیم

درواقع Action یک Delegate سادست!

اگر Action را دیکامپایل کنید به این موضوع پی می برید:

https://gist.github.com/smkplus/a38343da8dbd408dc811ede9f4d76643

حال به کد قبلی باز می گردیم و به جای استفاده از delegate از شکل خلاصه آن یعنی Action استفاده می کنیم:

https://gist.github.com/smkplus/b49b67e7a379e14e6634968df115d13a