Ali Shobeyri
Ali Shobeyri
خواندن ۳ دقیقه·۴ سال پیش

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

در لغت Compose به معنی ساختن و Composite به معنی ترکیبِ چند چیز هست ، در الگویِ Composite هم ما به همین مفاهیم کار داریم . کاری ما قصد انجام اونو داریم اینه که یک سری از اشیا رو به عنوان یک گروه در نظر بگیریم و یک سلسله مراتب درست کنیم ، در این الگو ما اشیائی رو داریم که یک عضو از جنس خودشون یا کلاس‌های مشابه رو در خودشون دارن ، چون این الگو برای ما تشکیل یک ساختار رو میده پس در طبقه بندی Structural می‌گذاریمش ، در این الگو ما چند بخش داریم :

شِمایِ کلی Composite
شِمایِ کلی Composite

Component

یک interface (یا کلاسِ Abstract) که در اون توابع اصلی رو تعریف می‌کنیم ، باقی اشیا باید از اون implement بشند .

Leaf

به اشیایی که در آخرین سطوحِ گرافِ ما قرار دارند ، این اشیا دیگه عضوی از خودشون یا کلاس‌های مشابه رو ندارند .

Composite

این مانند Leaf است با این تفاوت که می‌تواند جنسی از خودش را به عنوان عضو بپذیرد ، یعنی در گراف ، فرزند داشته باشد .

صورت مساله

سازمانی دارای CEO و CTO و برنامه‌نویس است ، چارت سازمانی را به صورت Composite در می‌آوریم ، نیاز به چند کلاس داریم ، یکی یک کلاسِ Abstract به نام Human ، در این کلاس اسم + تابعی برای چاپ اسم و تابعی برای چاپِ زیرمجموعه‌ها (یا همون گره و Node ها) رو داریم :

https://gist.github.com/sasssass/771d92191210ac4c36f7b2bd22e6c5e0

بعد از آن Head رو مشخص می‌کنیم ، مسلما بالاترین راس یعنی CEO رو به عنوان Head در نظر می‌گیریم :

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

این Head یا CEO همان Composite است و می‌تواند در داخل خودش لیستی از اشیا از جنس Human داشته باشد ، ما یک شی به نام CTO رو به اون وصل خواهیم کرد ، پس CTO رو ایجاد می‌کنیم :

https://gist.github.com/sasssass/76d2a562bc6d179a624a2e6f74cac0c9

این کلاس نیز حالت Composite دارد ، CTO کنترلِ Developerها رو داره و Developerها دیگه زیرمجموعه ندارند (leaf یا برگ هستند) ، پس نیازی نیست براشون لیستی از nodeها ایجاد کنیم :

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

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

https://gist.github.com/sasssass/07fa9eb8ab03aac85d48449e6078cf4f
نکته : چون یکبار cto رو cast کردیم ، kotlin خودش می‌فهمه که جنس این شئ از CTO هست و بار دوم نیازی به cast نیست

در چه زمان‌هایی باید از این الگو استفاده کنیم ؟ در زمانی که بخواهیم یک رابطه ارث‌بری بین اشیاء ایجاد کنیم یا بخواهیم دسته‌ای از اشیاء رو به یک چشم ببینیم (همه از Human ارث برده‌اند) و ... .

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

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

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

جاواکاتلیناندرویدdesign patternدیزاین پترن
برنامه نویس اندروید - https://www.linkedin.com/in/iryebohs/
شاید از این پست‌ها خوشتان بیاید