بعد از مدتی که برنامه نویسی رو شروع میکنید اصطلاحاتی از با تجربههای این حوزه میشنویم یا میخوانیم.یکی از چیزهایی که زیاد شنیده میشود Design Patterns و یا در فارسی الگوهای طراحی هستند.
در سری مقالات الگوهای طراحی در اندروید در تلاشم تا Design Pattern های مهم رو بشناسیم و کاربرد آنها را در برنامه نویسی اندروید ببینیم.هدف این است که ببینیم بطور مثلا الگو Observer چیست؟چطور پیاده سازی میشود و در نهایت در برنامه نویسی اندروید کجا قابل استفاده است.پس با من همراه باشید.
در کتاب مقدس و بسیار عالی 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 میشوید.وقتی در کانال ویدیو جدیدی اضافه شود به شما خبر داده خواهد شد.شما در هر لحظه که بخواهید میتوانید اشتراک خود و یا کانالی که دنبال میکنید را عوض کنید.همچنین کانال هیچ وابستگی به دنبالکنندگانش ندارد و کار خود را انجام میدهد.
در دنیای اندروید هم اگر بخواهیم مثالی بزنیم،فرض کنید برنامه شما یک شی دارد که عملیات دریافت اطلاعات را از وب سرویس انجام میدهد.سایر اشیا دوست دارند،وقتی این شی اطلاعات را دریافت کرد،این تغییرات و اطلاعات را بدانند.
با توجه به تعاریف بالا،در این الگو دو بازیگر اصلی داریم:
1- دنبال کننده یا Observer/Subscriber
2- دنبال شونده یا Observable/Subject
وظیفه Observable این است که تغییرات وضعیت خود را به Observer اطلاع دهد.در مقابل ، وظیفه Observer این است که خود را به عنوان دنبال کننده حالت Observable معرفی کرده،تغییرات را دریافت کند و عملیات لازم را انجام دهد.
در ادامه برای فهم بهتر موضوع و همچنین آشنایی بیشتر، نحوه پیاده سازی این الگو را بررسی میکنیم.با من همراه باشید.
هر Observable دو کار اصلی باید انجام دهد: اول اینکه راهی فراهم سازد تا Observer ها خود را معرفی کنند و دوم ،راهی فراهم سازد تا تغییرات به Observer ها اطلاع داده شود.پس برای شروع یک interface میسازیم که بصورت زیر میباشد و هر کلاسی خواست Observable باشد باید این interface را پیاده سازی کند:
وظیفه Observer این است که تغییرات را دریافت کند.پس متدی باید داشته باشد که تغییرات را دریافت کرده و عملیات لازم را انجام دهد.پیاده سازی این بخش نیز از طریق interface میباشد و هر کلاسی که بخواهد Observer باشد،باید این interface را پیاده سازی کند:
ابتدا کلاس Subject که IObservable را پیاده سازی کرده به صورت زیر میسازیم:
در تصویر فوق،در متد addObserver ، ما Observer ها را به لیست خود اضافه میکنیم و در متد notifyChanges، برای تمام آنها،متد updateState ، صدا زده میشود تا تغییرات را دریافت کرده و آنطور که دوست دارند با تغییرات برخورد کنند.
حال نوبت به کلاس Subcriber میرسد.در تصویر زیر نحوه پیاده سازی این کلاس را میبینید:
در پیاده سازی کلاس Subscriber،آنچه حائز اهمیت است این است که این کلاس در متد سازنده خود،یک IObservable میگیرد و با صدا زدن متد addObserver خود را به عنوان دنبال کننده معرفی میکند.در نهایت در متد updateState ،ما عملیات لازم را انجام میدهیم.بطور مثال اینجا با فراخوانی متد getFullTitle، تغییرات را مشاهده میکنیم.
برای تست برنامه یک اکتیویتی میسازیم.از هر کلاس شی ساخته و در نهایت حالت شی subject را تغییر میدهیم و تغییرات را در logcat برنامه میبینیم:
دقت شود در تصویر فوق بعد از تغییر حالت mySubject، به مدت 2 ثانیه Thread به حالت sleep رفته و با صدا زدن متد notifyChanges، تغییرات برای mySubscriber ارسال میشود.
در قسمت بعد کاربرد این الگو را در برنامه نویسی اندروید میبینیم.
امیدوارم این مطلب مفید بوده باشد.برای بررسی بیشتر، از گیت هاب من به آدرس زیر میتوانید کدهای را دریافت کنید.