Design Pattern, Swift, کد نویسی, متوسط

observer pattern in swift

در این مبحث پترن ناظر یا همان observer رو در سویفت می خواهم براتون تشریح کنم .

در صورتی که با observer pattern آشنا نیستید و می خواهید RxSwift رو شروع کنید بهتون پیشنهاد می کنم این مطلب رو کامل بخونید که بتونید با مباحث subject در RxSwift چیه و .. بهتر ارتباط برقرار کنید. ( بعد از توضیح چند پترن دیگه حتما پست هایی از RxSwift هم براتون خواهم گذاشت)

خب ابتدا می خواهیم توضیح بدیم که این پترن قراره چه کاری رو برامون تسهیل کنه.

فرض کنم یک آبجکت داریم که قراره از طرف سایر آبجکت ها نظارت بشه ( همون Observable می شه که به عنوان مثال یک ایستگاه هواشناسی رو در نظر بگیرید که اعلام وضعیت آب و هوا می کنه ) و چندین آبجکت داریم که شی Observable ما رو نظارت می کنند که تغییری کرده یا نه ( که بهش Observer میگن که توی این مثال شما فرض کنید یک سری آبجکت مثل گوشی موبایل که از برنامه weather استفاده می کنه , یک دستیار های هوشمند داخل اتومبیل که وضعیت آب و هوایی رو اعلام می کنه یا یک پنجره هوشمند که یک اسکرین برای اعلام وضعیت آب و هوایی داره) .

خب تا اینجا فهمیدیم این ارتباط یک به چند هست یعنی ما یک شی نظارت شده یا همان observable داریم که چند شی ناظر یا همان observer اون رو نظارت می کنند.

این موضوع رو توی شکل زیر بهتر می تونید متوجه شوید

observer pattern i-swift.ir

توی شکل بالا ما یک شی نظارت شده که بهش observable یا همچنین بهش subject هم میگن داریم که چندین شی ناظر را از تغییرات خودش مطلع می کنه.

خب حالا می خواهیم یک نمونه از این پترن رو پیاده سازی کنیم

فرضیات

  • یک ایستگاه هواشناسی داریم که وضعیت آب و هوایی رو می خواد بررسی کنه
  • چندین شی مختلف داریم که به دنبال راهی برای رصد کردن وضعیت آب و هوایی هستند . ( در اینجا دو شی تلفن همراه و پنجره هوشمند رو توی مثال می آوریم)

 

Obsrver Interface

خب حالا وقتشه که رابط های کد ناظر هامون رو تولید کنیم . ما فعلا فقط به دو چیز جامع که برای کل رابط هامون مشترک هست نیاز داریم . id شی و متد بروز رسانی

 

Observable Interface

بعد از تولید رابط ناظر حالا می تونیم رابط شی نظارت شده رو هم تولید کنیم . این شی سه متد اساسی داره که عبارتند از متد افزودن ناظر ( که بعضا افراد با نام های add , append , insert , attach و … معرفی می کنند ) و متد دوم متد حذف ناظر ( که با نام های delete , remove , detach و … نامیده می شه ) و در آخر متد اعلام وضعیت که بانام notify یا مانند آن ساخته می شود.

 

ساخت شی نظارت شونده

این شی همون شی ای هست که قراره ناظران تغییراتش رو متوجه شوند و ب توجه به تغییرات رفتار هایشان را تغییر بدهند. با توجه به مثالی که قرار هست با هم کار کنیم فرض می گیریم این شی یک ایستگاه هواشناسی است.

خب اینجا ما نیاز به یک آرایه از ناظر ها داریم که در صورت هر گونه تغییر بتونیم پیدا کنیم و بهشون اطلاع بدیم , همچنین یک متغییر درجه دما رو داریم که دمای هوا رو توی اون ذخیره می کنیم.

 

توی مثال بالا ما همچنین سه متد add و delete و notify رو داریم که به ترتیب برای افزودن یک ناظر , حذف یک ناظر , و اعلام به ناظرین  استفاده می شود.

 

کلاس تلفن همراه

توی این کلاس ما نیاز به یک متغییر از نوع کلاس نطارت شونده داریم که خصوصیات شخصی کلاس رو ( که در اینجا همون درجه دما می باشد ) رو دنبال کنیم ( منظور از خصوصیات شخصی خصوصیت هایی است که توی protocol تعریف نمی شوند)

متد update متدی هست که در صورت وجود هر گونه تغییری توسط notify در شی subject صدا می زنیم

همون طور که می بینید از شی نظارت شونده برای دسترسی به دما در متد update  استفاده کردیم .

 

کلاس پنجره هوشمند

این کلاس از لحاظ کلی رفتاری مثل کلاس تلفن همراه دارد . ولی شما می توانید برای هر کدام رفتار های متفاوتی در زمان بروز رسانی بنویسید . مثلا در تلفن همراه ممکن است notification به کاربر اعلام شود و در پنجره مثلا پنجره در دمای بالا یا پایین بسته شود.

 

اجرای کد

برای اجرا شما باید رفتاری مشابه زیر داشته باشید و بعد از اعمال تغییرات تابع notify را از کلاس subject فراخوانی کنید که به همه ناظرین اطلاع دهد

 

شما می تونید کد این پروژه رو از لینک پایین دریافت کنید.

سورس فایل در گیت هاب

در صورتی که هر نوع سوالی داشتید یا مطلبی که موضوع رو کامل تر کنه همینجا کامنت بگذارید

موفق و پیروز باشید

1 دیدگاه در “observer pattern in swift

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.