اتفاق مورد علاقه خودت رو از دست نده!
ما یک الگویی داریم که سبب میشود object ها از اتفاقی که وقوع آن برایشان مهم است، باخبر شوند. اشیاء حتی میتوانند در Runtime تصمیم بگیرند که آیا از یک اتفاق باخبر شوند یا خیر.
سنازیوی زیر را در نظر بگیرید:
فرض کنید شما برای پیادهسازی نسل جدید یک سیستم مانیتورینگ آب و هوایی انتخاب شدهاید و کارفرما نامهای با این مضمون برای شما ارسال میکند:
“انتخاب شما رو برای پیادهسازی نسل جدید نرم افزار مانیتورینگ آب و هوایی تبریک میگویم.
ایستگاه آب و هوایی بر اساس طراحی ما منتظر دریافت WeatherData object میباشد که وضعیت آب و هوای فعلی یعنی دما، رطوبت و فشار را اندازهگیری میکند. ما از شما انتظار داریم که در ابتدا یک نرم افزار طراحی کنید که دارای سه نوع نمایش باشد : ۱-وضعیت فعلی ۲-آمار آب و هوا ۳-یک پیش بینی ساده و همه اینها بر اساس آخرین WeatherData Object به صورت RealTime بروز رسانی شوند.
همچنین میخواهیم این نرم افزار قابل گسترش باشد. ما میخواهیم یک API داشته باشیم که بقیه Developer ها بتوانند نمایشهای خودشان را ایجاد کنند. خواهش میکنم که این API را برای ما فراهم کنید.
ما یک بیزنیس مدل خوب داریم : اول اینکه از کاربران در ازای نمایش هر صفحه هزینه دریافت می کنیم. ما مشتاقانه منتظر طراحی و نسخه آلفا نرم افزار شما هستیم.”
یک نمایش کلی از نرم افزار آب و هوایی!
سه بازیگر اصلی در این سیستم ایستگاه آب و هوایی (که وظیفه به دست آوردن اطلاعات آب و هوایی را دارد)،شیء WeatherData (که وظیفه انتقال داده بین ایستگاه آب و هوایی و ابزار نمایش را دارد) و display (وظیفه نمایش وضعیت فعلی آب و هوا را دارد).
شیء WeatherData میداند که چطور با ایستگاه فیزیکی آب و هوا برای گرفتن آخرین داده ارتباط برقرار کند. سپس این شیء باعث بروز رسانی نمایشهای وضعیت فعلی آب و هوا، آمار آب و هوا و پیش بینی ساده آب و هوا میشود.
وظیفه ما این است که یک اپلیکیشنی تولید کنیم که از شیء WeatherData برای بروزرسانی ۳ نمایشهای وضعیت فعلی آب و هوا، آمار آب و هوا و پیش بینی ساده آب و هوا استفاده کند.
میخوای یه فروشگاه به وسعت اینترنت داشته باشی؟
ما حرفهایترین فروشگاه آنلاین رو برات طراحی میکنیم.
کلاس WeatherData
سه متد (getTemprature) و (getHumidity) و (getPressure) آخرین دیتاهای وضعیت آب و هوا را در اختیار میگذارد. ما به این کاری نداریم که این دادهها از کجا و به چه صورت میرسند و ما فقط میدانیم که آخرین دادهها را میتوانیم توسط این سه متد دریافت کنیم.
متد (measurementsChanged) زمانی صدا زده میشود که اطلاعات جدید از ایستگاه آب و هوایی دریافت شود و و برنامه نویس میتواند کد خودش را زمانی که اطلاعات جدید دریافت میشود در این متد پیاده سازی کند.
وظیفه ما پیاده سازی متد (measurementsChanged) میباشد و باید سبب بروز رسانی ۳ نمایش وضعیت فعلی آب و هوا، آمار آب و هوا و پیشبینی ساده آب و هوا شود.
ما تا الان چه چیزی را میدانیم؟
ویژگیهای رسیده به دست ما تا کنون شفاف هستند ولی باید بفهمیم که چه کار باید انجام دهیم.
ما چه چیزی تا الان میدانیم؟
۱-کلاس WatherData دارای سه متد برای گرفتن آخرین اندازهها میباشد : دما،رطوبت و فشار
(getTemperature) (getHumidity) (getPressure)
۲-متد (measurementsChanged) زمانی صدا زده میشود که اندازههای جدید از ایستگاه آب و هوایی دریافت شود و موجود باشد.(ما نمیدانیم که این متد به چه صورت صدا زده میشود وفقط میدانیم که صدا زده میشود.)
۳-ما نیاز داریم که سه نمایش پیادهسازی کنیم : وضعیت فعلی آب و هوا، آمار آب و هوا و پیش بینی ساده آب و هوا
۴-سیستم باید قابلیت گسترس داشته باشد. بقیه توسعهدهندگان باید قابلیت ساخت نمایشهای شخصیسازی شده را داشته باشند و بتوانند به حذف و اضافه کردن نمایش در نرم افزار بپردازند.
اولین پیاده سازی
اینجا ما اولین پیاده سازی ممکن را داریم.
در اینجا ما آخرین اندازهها را گرفتهایم و با صدا کردن متد update هر نمایش به بروزرسانی نمایشها با آخرین داده های دریافت شده پرداختهایم.
اما کجای پیادهسازی ما اشتباه است؟
۱-با پیادهسازی کد واقعی در متد هیچ راهی برای اضافه کردن display بدون تغییر کد کلاس وجود ندارد.
۲-میتوانیم حداقل یک اینترفیس برای ارتباط با صفحات نمایش تعریف کنیم. همه آنها یک متد آپدیت دارند که سه پارامتر دما، رطوبت و فشار را میگیرند.
در اینجا ما باید از الگوی طراحی Observer استفاده کنیم. ابتدا به بررسی کلی این الگو پرداخته و سپس برمیگردیم و روی برنامه فعلی اعمال میکنیم.
منبع : کتاب Head First Design Patterns