الگویِ طراحیِ Decorator (جاوا و کاتلین)

یکی از الگوهایِ طبقه Structural ، الگویِ Decorator هست ، اگه بخوام ترجمه فارسیشو بگم باید بگم "تزئین کننده" ، در این الگو شما می‌تونید یک کلاس رو تزئین کنید ! یعنی چی ؟ یعنی بهش Functionality های جدید اضافه کنید ، شاید تا اینجا بگید مگه این کار رو با ارث بری انجام نمی‌دیم ؟ قبل از توضیح به شِمایِ کلیِ این الگو دقت کنید :

ما در Decorator یک Component داریم که یک interface یا abstract class هست که باقی کلاس‌هامون قراره از اون مشتق بشن ، مثلا فرض کنید کلاسِ "میوه" اون کلاس مدنظرِ ماست ، حالا ConcreteComponent میشه کلاسی مثل "پرتقال" ، Decorator یک abstract class هست که از Component مشتق میشه و در عین حال یک Component رو درون خودش هم داره (یک متغیر از جنس Component عضو اونه) ، ConcreteDecorator هم کلاس‌هایی میشن که از Decorator مشتق شدن ، با با استفاده از Decorator می‌ـونیم خواصِ جدیدی به کلاس Component اضافه کنیم ، ولی چرا از ارث بریِ خالی استفاده نمی‌کنیم ، برگردیم به مثال "میوه" و "پرتقال" ، فرض کنید می‌خوایم "پرتقالِ خونی" ، "پرتقالِ تامسون" ، "پرتقالِ گنده" و ... رو داشته باشیم ، یک راهِ حل اینه که "پرتقالِ خونی" از "پرتقال" ارث ببره ، مشکل چیه ؟ مشکل زمانی پیش میاد که بخوایم پرتقال هم خونی باشه هم تامسون ! اون وقت باید دوباره یک کلاسِ جدید به اسم "پرتقالِ خونی و تامسون" ایجاد کنیم و الی آخر ! اما اگه از Decorator استفاده کنیم چون در Decorator هم از خودِ Component متشق شده و هم یک عضو از Component داره می‌تونیم سه تا Component برای "خونی" ، "تامسون" و "گنده" بسازیم و اونا رو تو در تو به عنوان ورودیِ هم بدیم و این طوری هر سه ویژگی رو داشته باشیم :

پرتقالِ تامسون ، ورودیِ خونی میشه و خونی ، ورودیِ گنده
پرتقالِ تامسون ، ورودیِ خونی میشه و خونی ، ورودیِ گنده

صورت مساله

همین مثال بالا رو به صورت کد در بیارید

https://gist.github.com/sasssass/f47cdfb3e63a6935f9378d74f630721f

و بعد خیلی راحت ازش استفاده کنید :

https://gist.github.com/sasssass/275fcbb2717221c029731572a8b77de2

و خروجی این میشه : Orange Bloody Thompson Big

باقی مقالات در مورد الگوی‌های طراحی رو در این مقاله بخونید .

من رو در لینکدین و اینستاگرام دنبال کنید ???

اگه دوست داشتید می‌تونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???