الگوهای طراحی در اندروید (فصل اول - اپیزود 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پیاده‌سازی متدهای مربوط به کلاس IObservableدر تصویر فوق،در متد addObserver ، ما Observer ها را به لیست خود اضافه می‌کنیم و در متد notifyChanges، برای تمام آنها،متد updateState ، صدا زده می‌شود تا تغییرات را دریافت کرده و آنطور که دوست دارند با تغییرات برخورد کنند.حال نوبت به کلاس Subcriber می‌رسد.در تصویر زیر نحوه پیاده سازی این کلاس را می‌بینید:کلاس Subscriber که از IObserver مشتق شده است!!در پیاده سازی کلاس Subscriber،آنچه حائز اهمیت است این است که این کلاس در متد سازنده خود،یک IObservable می‌گیرد و با صدا زدن متد addObserver خود را به عنوان دنبال کننده معرفی می‌کند.در نهایت در متد updateState ،ما عملیات لازم را انجام می‌دهیم.بطور مثال اینجا با فراخوانی متد getFullTitle، تغییرات را مشاهده می‌کنیم.تست برنامه برای تست برنامه یک اکتیویتی میسازیم.از هر کلاس شی ساخته و در نهایت حالت شی subject را تغییر می‌دهیم و تغییرات را در logcat برنامه میبینیم:ساخت اکتیویتی و شی های مورد نظرساخت thread برای تغییر حالت subject دقت شود در تصویر فوق بعد از تغییر حالت mySubject، به مدت 2 ثانیه Thread به حالت sleep رفته و با صدا زدن متد notifyChanges، تغییرات برای mySubscriber ارسال می‌شود.نتیجه خروجی در LogCatدر قسمت بعد کاربرد این الگو را در برنامه نویسی اندروید می‌بینیم.امیدوارم این مطلب مفید بوده باشد.برای بررسی بیشتر، از گیت هاب من به آدرس زیر می‌توانید کدهای را دریافت کنید. https://github.com/eliasmohammadi/Android_design_pattern