1. چیستی الگوی ترکیبی

الگوی ترکیبی یک الگوی طراحی ساختاری شیء-گرا است که به طور متداول استفاده می‌شود. این الگو اشیاء را به یک ساختار درختی ترکیب می‌کند تا رابطه "قسمت-کل" سلسله مراتبی را نمایش دهد و به کاربران اجازه دهد که به شیء‌ها و ترکیبات شیء‌ها به یک شکل سازماندهی شده و یکپارچه دسترسی داشته باشند.

2: ویژگی‌ها و مزایای الگوی ترکیبی

مزایای اصلی الگوی ترکیبی عبارتند از:

  1. این الگو قادر است تا اشیاء پیچیده سلسله مراتبی را به وضوح تعریف کند که همه یا بخشی از سلسله مراتب شیء را نمایش دهد و اضافه کردن اجزاء جدید را آسان‌تر می‌کند.
  2. این الگو یک رابط یکپارچه فراهم می‌کند که دسترسی به قسمت‌های ترکیبی و شیء‌های فردی را یکنواخت می‌کند و کاربران را قادر می‌سازد که از شیء‌های تکی و شیء‌های ترکیبی به یک شیوه استفاده کنند.

3. حوزه‌های کاربردی الگوی ترکیبی

  1. وقتی می‌خواهید سلسله مراتبی قسمت-کل اشیاء را نمایش دهید.
  2. وقتی می‌خواهید که کاربران اختلافات بین اشیاء ترکیبی و اشیاء فردی را نادیده بگیرند و به صورت یکنواخت از همه اشیاء در ساختار ترکیبی استفاده کنند.

4. پیاده‌سازی الگوی ترکیبی در گولانگ

فرض کنید که ما در حال طراحی یک برنامه تجارت الکترونیک هستیم، فهرست محصول یک مثال خوب از الگوی ترکیبی است. یک دسته می‌تواند شامل دسته‌های دیگر و همچنین محصولات باشد (مانند دسته الکترونیک حاوی تلفن‌ها، کامپیوترها است و تلفن‌ها شامل آیفون، تلفن‌های سامسونگ، و غیره می‌شوند).

4.1 دیاگرام کلاس UML

الگوی ترکیبی در گولانگ

4.2 معرفی مثال

در این مثال، ما Component (به طور واضح از ویژگی رابطِ جهت‌گیری شیء از شیء استفاده می‌کنیم) را به عنوان کلاس پایه انتزاعی و Composite و Leaf هر دو این رابط را پیاده‌سازی می‌کنند که به ترتیب اشیاء ظرف‌ها و اشیاء پایه را نمایش دهند.

4.3 پیاده‌سازی گام 1: تعریف کلاس مولفه انتزاعی

4.3.1 تعریف رابط کلاس مولفه انتزاعی

//Component: رابط مولفه پایه، تعریف‌های شایع گروه‌ها و فردی‌ها
type Component interface {
    جستجو(string)
}

4.3.2 پیاده‌سازی متدهای پایه کلاس مولفه انتزاعی

این گام به خصوص در کلاس مولفه ظرف و کلاس مولفه برگ اجرا می‌شود.

4.4 پیاده‌سازی گام 2: تعریف کلاس مولفه برگ

این کلاس محسوب می‌شود به عنوان دسته یا شیء زیرین در سلسله مراتب و اشیاء لایه بعدی را ندارد.

4.4.1 ارث بری از کلاس مولفه انتزاعی

در گولانگ، ارث بری از رابط از طریق روش‌ها از طریق Struct پیاده‌سازی می‌شود.

4.4.2 پیاده‌سازی متدهای مخصوص کلاس مولفه برگ

//Product: نماینده یک برگه برگ، یعنی یک محصول و نمی‌تواند شاخه بچه داشته باشد
type Product struct {
    Name string
}

//Search: جستجوی محصولات
func (p *Product) جستجو(keyword string) {
    if strings.Contains(p.Name, keyword) {
        fmt.Printf("محصول: '%s' شامل کلیدواژه: '%s' می‌باشد\n", p.Name, keyword)
    }
}

4.5 پیاده‌سازی گام 3: تعریف کلاس مولفه ظرف

این کلاس برای ذخیره و مدیریت اشیاء بچه استفاده می‌شود و معمولا شامل برخی از متدها برای مدیریت و سازماندهی اشیاء بچه است مانند add(Component)، remove(Component)، و غیره.

4.5.1 ارث بری از کلاس مولفه انتزاعی

این نیز از طریق استفاده از Struct برای پیاده‌سازی روش‌های رابط در گولانگ پیاده‌سازی می‌شود.

4.5.2 پیاده‌سازی متدهای مخصوص کلاس مولفه ظرف

//Category: نماینده یک برگه ظرف، یعنی دسته بندی محصول که می‌تواند شاخه بچه داشته باشد
type Category struct {
    Name     string
    Children []Component
}

// Add: اضافه کردن یک شاخه بچه
func (c *Category) Add(child Component) {
    c.Children = append(c.Children, child)
}

//  Remove: حذف یک شاخه بچه
func (c *Category) Remove(child Component) {
    // پیاده‌سازی خاص حذف حذف شده است
}

// جستجو: جستجوی محصولات
func (c *Category) جستجو(keyword string) {
    fmt.Printf("دسته: %s\n", c.Name)
    for _, composite := range c.Children {
        composite.جستجو(keyword)
    }
}

4.6 مرحله اجرایی 4: مثال کد مشتری

یک ساختار را نمونه‌سازی کرده، آن را به یک ساختار درختی تجمیع کرده و سپس عملیات دسترسی به ساختار درختی را فراخوانی کنید.

func main() {
    root := &Category{Name: "ریشه"}
    electronics := &Category{Name: "لوازم الکترونیکی"}

    phone := &Product{Name: "تلفن"}
    tv := &Product{Name: "تلویزیون"}

    root.Add(electronics)
    electronics.Add(phone)
    electronics.Add(tv)

    root.Search("تلفن") // این عملیات در تمام زیرمجموعه‌ها جستجو خواهد کرد
}