الگوهای طراحی ساختاری: Facade، Flyweight و Proxy
الگوهای طراحی ساختاری به شما در سازماندهی کلاسها و اشیاء کمک میکنند.
امروز سه الگوی نهایی را برای تکمیل جعبهابزار خود بررسی میکنیم.
۱. الگوی Facade الگوی Facade سیستمهای پیچیده را ساده میکند. این الگو یک رابط کاربری ساده برای مجموعهای از کلاسهای پیچیده و نامنظم فراهم میکند.
یک سینما را تصور کنید. برای تماشای فیلم، باید نورها را کم کنید، پروژکتور را روشن کنید و پردهها را باز کنید. به جای فراخوانی پنج سیستم مختلف، تنها یک متد را فراخوانی میکنید: theater.watch_movie().
موارد استفاده:
- میخواهید یک زیرسیستم پیچیده را ساده کنید.
- به یک نقطه ورود واحد برای یک API بزرگ نیاز دارید.
- میخواهید کلاینتها را از منطق داخلی جدا کنید.
۲. الگوی Flyweight الگوی Flyweight در مصرف حافظه صرفهجویی میکند. این الگو زمانی کاربرد دارد که هزاران شیء مشابه داشته باشید.
به جای ذخیره تمام جزئیات در هر شیء، دادهها را تقسیم میکنید. دادههای مشترک و تغییرناپذیر (intrinsic state) را در یک مکان نگه میدارید و دادههای منحصربهفرد (extrinsic state) را جداگانه مدیریت میکنید.
موارد استفاده:
- مصرف حافظه یک مشکل جدی است.
- مدیریت میلیونها شیء مشابه دارید، مانند کاراکترها در یک ویرایشگر متن یا ذرات در یک بازی.
- میخواهید از Object Pooling برای بهبود عملکرد استفاده کنید.
۳. الگوی Proxy الگوی Proxy به عنوان جایگزینی برای یک شیء دیگر عمل میکند. این الگو برای کنترل دسترسی، بین کلاینت و شیء اصلی قرار میگیرد.
یک پروکسی میتواند:
- Lazy load: بارگذاری تصاویر سنگین را تنها زمانی که کاربر روی آنها کلیک میکند انجام دهد.
- کنترل دسترسی: بررسی کند که آیا کاربر اجازه حذف یک پایگاه داده را دارد یا خیر.
- ثبت فعالیت (Logging): ردیابی کند که چه کسی از یک سرویس خاص استفاده میکند.
- کش کردن نتایج: به جای اجرای منطقهای سنگین و پرهزینه، دادههای ذخیرهشده را بازگرداند.
موارد استفاده:
- نیاز دارید عملیاتهای پرهزینه را با تأخیر انجام دهید.
- باید از یک سرویس حساس محافظت کنید.
- میخواهید بدون تغییر در کلاس اصلی، قابلیت ثبت فعالیت یا امنیت را اضافه کنید.
جدول خلاصه
• Adapter: سیستمهای ناسازگار را با هم هماهنگ میکند. • Bridge: انتزاع (Abstraction) را از پیادهسازی جدا میکند. • Composite: ساختارهای درختی میسازد. • Decorator: بدون تغییر در کلاسها، رفتار جدیدی اضافه میکند. • Facade: زیرسیستمهای پیچیده را ساده میکند. • Flyweight: برای صرفهجویی در حافظه، دادهها را به اشتراک میگذارد. • Proxy: دسترسی به اشیاء را کنترل میکند.
قانون طلایی: از این الگوها برای نگهداریپذیرتر کردن کد استفاده کنید. از آنها صرفاً برای خودنمایی استفاده نکنید.
در ادامه، سری الگوهای طراحی رفتاری (Behavioral Design Patterns) را شروع خواهیم کرد.