الیاس محمدی
الیاس محمدی
خواندن ۳ دقیقه·۵ سال پیش

الگوهای طراحی در اندروید (فصل اول - اپیزود 1) : Observer Pattern

بعد از مدتی که برنامه نویسی رو شروع می‌کنید اصطلاحاتی از با تجربه‌های این حوزه می‌شنویم یا می‌خوانیم.یکی از چیزهایی که زیاد شنیده می‌شود Design Patterns و یا در فارسی الگوهای طراحی هستند.

در سری مقالات الگوهای طراحی در اندروید در تلاشم تا Design Pattern های مهم رو بشناسیم و کاربرد آنها را در برنامه نویسی اندروید ببینیم.هدف این است که ببینیم بطور مثلا الگو Observer چیست؟چطور پیاده سازی می‌شود و در نهایت در برنامه نویسی اندروید کجا قابل استفاده است.پس با من همراه باشید.

تعریف Observer Pattern

در کتاب مقدس و بسیار عالی Head First Design Patterns تعریف زیر برای الگو Observer آمده است:

Defines a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updates automatically!!

اگر بخواهیم این تعریف را تفسیر کرده و به زبان فارسی بنویسیم، می‌توان گفت: وقتی یک شی یا موجودیت تغییر می‌کند و سایر موجودیت ها و شی‌ها خواستار این هستند که تغییرات آن شی را بدانند.

در دنیا واقعی اگر بخواهیم مثالی بزنیم، این الگو را می‌توان اینطور یافت که شما عضو دنبال‌کنندگان یا Subscriberهای یک کانال خاص در YouTube می‌شو‌ید.وقتی در کانال ویدیو جدیدی اضافه شود به شما خبر داده خواهد شد.شما در هر لحظه که بخواهید می‌توانید اشتراک خود و یا کانالی که دنبال می‌کنید را عوض کنید.همچنین کانال هیچ وابستگی به دنبال‌کنندگانش ندارد و کار خود را انجام می‌دهد.

در دنیای اندروید هم اگر بخواهیم مثالی بزنیم،فرض کنید برنامه شما یک شی دارد که عملیات دریافت اطلاعات را از وب سرویس انجام می‌دهد.سایر اشیا دوست دارند،وقتی این شی اطلاعات را دریافت کرد،این تغییرات و اطلاعات را بدانند.

اجزا کلی الگو Observer

با توجه به تعاریف بالا،در این الگو دو بازیگر اصلی داریم:

1- دنبال کننده یا Observer/Subscriber

2- دنبال شونده یا Observable/Subject

وظیفه Observable این است که تغییرات وضعیت خود را به Observer اطلاع دهد.در مقابل ، وظیفه Observer این است که خود را به عنوان دنبال کننده حالت Observable معرفی کرده،تغییرات را دریافت کند و عملیات لازم را انجام دهد.

در ادامه برای فهم بهتر موضوع و همچنین آشنایی بیشتر، نحوه پیاده سازی این الگو را بررسی می‌کنیم.با من همراه باشید.

پیاده سازی Observable

هر Observable دو کار اصلی باید انجام دهد: اول اینکه راهی فراهم سازد تا Observer ها خود را معرفی کنند و دوم ،راهی فراهم سازد تا تغییرات به Observer ها اطلاع داده شود.پس برای شروع یک interface می‌سازیم که بصورت زیر می‌باشد و هر کلاسی خواست Observable باشد باید این interface را پیاده سازی کند:

پیاده سازی Observer

وظیفه Observer این است که تغییرات را دریافت کند.پس متدی باید داشته باشد که تغییرات را دریافت کرده و عملیات لازم را انجام دهد.پیاده سازی این بخش نیز از طریق interface می‌باشد و هر کلاسی که بخواهد Observer باشد،باید این interface را پیاده سازی کند:

پیاده سازی کلاس‌های مورد نظر

ابتدا کلاس Subject که IObservable را پیاده سازی کرده به صورت زیر می‌سازیم:

کلاس Subject
کلاس Subject


پیاده‌سازی متدهای مربوط به کلاس IObservable
پیاده‌سازی متدهای مربوط به کلاس IObservable

در تصویر فوق،در متد addObserver ، ما Observer ها را به لیست خود اضافه می‌کنیم و در متد notifyChanges، برای تمام آنها،متد updateState ، صدا زده می‌شود تا تغییرات را دریافت کرده و آنطور که دوست دارند با تغییرات برخورد کنند.

حال نوبت به کلاس Subcriber می‌رسد.در تصویر زیر نحوه پیاده سازی این کلاس را می‌بینید:

کلاس Subscriber که از IObserver مشتق شده است!!
کلاس Subscriber که از IObserver مشتق شده است!!

در پیاده سازی کلاس Subscriber،آنچه حائز اهمیت است این است که این کلاس در متد سازنده خود،یک IObservable می‌گیرد و با صدا زدن متد addObserver خود را به عنوان دنبال کننده معرفی می‌کند.در نهایت در متد updateState ،ما عملیات لازم را انجام می‌دهیم.بطور مثال اینجا با فراخوانی متد getFullTitle، تغییرات را مشاهده می‌کنیم.

تست برنامه

برای تست برنامه یک اکتیویتی میسازیم.از هر کلاس شی ساخته و در نهایت حالت شی subject را تغییر می‌دهیم و تغییرات را در logcat برنامه میبینیم:

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


ساخت thread برای تغییر حالت subject
ساخت thread برای تغییر حالت subject

دقت شود در تصویر فوق بعد از تغییر حالت mySubject، به مدت 2 ثانیه Thread به حالت sleep رفته و با صدا زدن متد notifyChanges، تغییرات برای mySubscriber ارسال می‌شود.

نتیجه خروجی در LogCat

در قسمت بعد کاربرد این الگو را در برنامه نویسی اندروید می‌بینیم.

امیدوارم این مطلب مفید بوده باشد.برای بررسی بیشتر، از گیت هاب من به آدرس زیر می‌توانید کدهای را دریافت کنید.

https://github.com/eliasmohammadi/Android_design_pattern


androidobserver patterndesign patternاندرویدبرنامه نویسی
Android Developer With a Passion to Learn
شاید از این پست‌ها خوشتان بیاید