در لغت Compose به معنی ساختن و Composite به معنی ترکیبِ چند چیز هست ، در الگویِ Composite هم ما به همین مفاهیم کار داریم . کاری ما قصد انجام اونو داریم اینه که یک سری از اشیا رو به عنوان یک گروه در نظر بگیریم و یک سلسله مراتب درست کنیم ، در این الگو ما اشیائی رو داریم که یک عضو از جنس خودشون یا کلاسهای مشابه رو در خودشون دارن ، چون این الگو برای ما تشکیل یک ساختار رو میده پس در طبقه بندی Structural میگذاریمش ، در این الگو ما چند بخش داریم :
یک interface (یا کلاسِ Abstract) که در اون توابع اصلی رو تعریف میکنیم ، باقی اشیا باید از اون implement بشند .
به اشیایی که در آخرین سطوحِ گرافِ ما قرار دارند ، این اشیا دیگه عضوی از خودشون یا کلاسهای مشابه رو ندارند .
این مانند Leaf است با این تفاوت که میتواند جنسی از خودش را به عنوان عضو بپذیرد ، یعنی در گراف ، فرزند داشته باشد .
سازمانی دارای CEO و CTO و برنامهنویس است ، چارت سازمانی را به صورت Composite در میآوریم ، نیاز به چند کلاس داریم ، یکی یک کلاسِ Abstract به نام Human ، در این کلاس اسم + تابعی برای چاپ اسم و تابعی برای چاپِ زیرمجموعهها (یا همون گره و Node ها) رو داریم :
بعد از آن Head رو مشخص میکنیم ، مسلما بالاترین راس یعنی CEO رو به عنوان Head در نظر میگیریم :
این Head یا CEO همان Composite است و میتواند در داخل خودش لیستی از اشیا از جنس Human داشته باشد ، ما یک شی به نام CTO رو به اون وصل خواهیم کرد ، پس CTO رو ایجاد میکنیم :
این کلاس نیز حالت Composite دارد ، CTO کنترلِ Developerها رو داره و Developerها دیگه زیرمجموعه ندارند (leaf یا برگ هستند) ، پس نیازی نیست براشون لیستی از nodeها ایجاد کنیم :
و در نهایت میتونیم به این شکل از این ساختار استفاده کنیم :
نکته : چون یکبار cto رو cast کردیم ، kotlin خودش میفهمه که جنس این شئ از CTO هست و بار دوم نیازی به cast نیست
در چه زمانهایی باید از این الگو استفاده کنیم ؟ در زمانی که بخواهیم یک رابطه ارثبری بین اشیاء ایجاد کنیم یا بخواهیم دستهای از اشیاء رو به یک چشم ببینیم (همه از Human ارث بردهاند) و ... .
باقی مقالات در مورد الگویهای طراحی رو در این مقاله بخونید .
من رو در لینکدین و اینستاگرام دنبال کنید ???
اگه دوست داشتید میتونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???