در این مقاله،تمایل داریم راجب الگوی decorator و نحوهی کار را، به اشتراک بگذاریم.decorator به کاربر اجازه می دهد به یک شی موجود قابلیت های جدیدی اضافه کند.
الگوی طراحی decorator در زیرگروه Structural Patter از Gang of Four Design Pattern در .NET قرار میگیرد.
الگوی Decorator جهت افزودن کارکرد جدید به یک شیء موجود، بدون تغییر ساختار آن بکار میرود.
از این رو الگوی Decoratorروشی جایگزین برای ارثبری جهت تغییر رفتار یک شیء ارائه میدهد.
در این مقاله، موارد زیر را خواهیم آموخت:
- الگوی طراحی Decorator
- راهنمای پیادهسازی
- پیادهسازی نمونه
الگوی طراحی Decorator
(Gang of Four (GoF در Dofactory بیان میکند.
” افزودن وظایفی مازاد به یک شیء بصورت پویا. Decoratorجایگزینی انعطافپذیر برای زیر کلاسها جهت توسعهی عملکرد ارائه میدهد. ”
- Decoratorدر زیرگروه الگوی طراحی ساختاری قرار میگیرد و نیز به عنوان Wrapper شناخته میشود.
- الگوی طراحی Decoratorاز اصل Open Closed، یکی از اصول SOLID پیروی میکند.
- به بیانی دیگر، جهت افزودن وظایف جدید به نمونهای مجزا از یک شیء، بدون افزودن آن وظایف به کلاس اشیاء. Decorator میتواند به عنوان جایگزینی برای ارثبری در نظر گرفته شود.
راهنمای پیادهسازی
- نیاز به افزودن وظایف به اشیاء مجزا بصورت پویا و شفاف.
- توسعه و بسط از طریق ایجاد زیر کلاسها بیهوده است.
- تعریف کلاس میتواند پنهان باشد.
- کلاسها برای ایجاد زیرکلاس در دسترس نیستند.
نمایش الگوی Decorator
موارد زیر در یک پیادهسازی معمول از الگوی طراحی Decoratorدخیل میباشند:
۱- Component
این مورد، نشاندهندهی نوع پایه از یک نوع حقیقی یا عینی میباشد.
۲- ConcreteComponent
این مورد، نوع عینی که جزء پایه را توسعه میدهد، نمایش میدهد. توجه داشته باشید که وظایف یا کارکردهای مازاد به این نوع اضافه میشوند.
۳- Decorator
این مورد، نشاندهنده به یک جزء (Component) است. کارکردهای پویا در این نوع افزوده میشوند.
۴- ConcreteDecorator
اشیاء، کلاسهایی هستند که در واقع وظایف را به کلاسهای ConcreteComponent میافزایند.
پیادهسازی نمونه
کلاسها، رابطها، و اشیائی که در پیادهسازی نمونه استفاده خواهیم کرد، بصورت زیر شناخته میشوند:
- Employee: کلاس Component
- EmployeeConcrete: کلاس ConcreteComponent
- EmployeeDecorator: کلاس Decorator
- PermanentEmployeeDecorator: کلاس ConcreteDecorator
- ContractEmployeeDecorator: کلاس ConcreteDecorator
کلاس Employee
نکته:
- الزاما بدین معنا نیست که باید از نوع انتزاعی (abstract) استفاده کنید.( نوع میتواند انتزاعی باشد یا نباشد.)
- همچنین میتوانید یک الگوی طراحی decoratorرا با استفاده از رابط پیادهسازی کنید.
- میتوانید از متدهایی که مجازی هستند در کلاسهای عینی خود استفاده کنید.
در اینجا بخاطر سادگی از نوع انتزاعی استفاده میکنیم.
کلاس EmployeeConcrete، کلاس Employee را بسط داده و خاصیتهایی مازاد میافزاید.
کلاس EmployeeDecorator، کلاس Employee را بسط داده، نمونهای از کلاس Component به نام Employee را پذیرفته، و متد Display() را بازنویسی میکند.
اکنون کلاسهای Component، ConcreteComponent و Decoratorآماده هستند. حال، میتوانیم کلاس EmployeeDecorator را جهت ایجاد کلاسهای ConcreteDecorator بسط دهیم.
کلاس PermanentEmployeeDecorator
فرض کنید که میتوانید نوع دیگری از employee نیز داشته باشید — یک contractual employee . برای نمایش آن، نیاز است کلاسی دیگر به نام ContractEmployeeDecorator، که کلاس EmployeeDecorator را بسط میدهد، ایجاد کنید.
اکنون، میتوانید نمونهای از PermanentEmployeeDecorator و ContractEmployeeDecorator ایجاد کرده و از آن بصورت زیر استفاده کنید.
معرفی رسمی مختصری از Decorator Patternرا دیدیم و سپس نگاهی به مسئلهی Concrete داشتیم که این ساختار گزینهای مناسب و طبیعی برای آن میباشد.
به عنوان مثالی دیگر میتوان به پیتزا فروشی یا تنظیمکنندهی ماشین یا دوچرخه اشاره کرد.
هر چیزی که با اشیائی در ارتباط باشد که باید رفتارشان بصورت پویا بسط داده شود، به آن مربوط است.
خلاصه
الگوی Decoratorدر صدد افزودن کارکرد به نمونههایی از اشیاء بصورت پویا در زمان اجرا، بدون نیاز تغییر تعریف کلاس نمونه میباشد.
این موضوع به خصوص در سناریوهایی که در آن نمونههای مختلفی از یک شیء میتوانند رفتار متفاوتی داشته باشند، کاربردی است.
دیدگاهها