نموذج التصميم المجمع

هذا النموذج بالرغم من تعقيد اسمه الا انه نموذج بسيط جدا. يستخدم هذا النموذج لاجراء عملية ما على مجموعة كبيرة من العناصر بدون معرفة عددها فمهما كان العدد سيستمر النموذج في تنفيذ العملية إلى انتهاء العدد. وتتكون تلك العناصر من صنفين الأول يكون حاوية ويحتوي على عناصر اما من نفس نوعه أو من نوع قابل للتشغيل.

نموذج المجمع composite يتكون من عنصرين هما الـ Composites و الـ Component وكلاهما يكون مشتق من نفس الواجهة وفي معظم الأوقات التعامل مع الـ Composites يكون غرضه هو كيفية الوصول للـ Component.

مثال بسيط: المقلب القديم الذي تحضر فيه هدية لاحد الأشخاص عبارة عن صندوق وبداخله صندوقين اخرين وكل صندوق من الصناديق داخلها صندوقين اخرين وهكذا إلى ان تصل إلى اخر الصناديق ويكون بها شئ تستطيع ان تستخدمه استخدام اخر بخلاف ان تقوم بفتحه لتبحث فيه.

هذا بالضبط مفهوم نموذج المجمع composite pattern. مثال عملي:قمنا اولا بعمل الواجهة واسميناها component وهذا الواجهة سنشتق منه صفين نعمل عليهما اولهما هو Leaf وهو العنصر الأصغر الذي يتكون منه العنصر الثاني وهو Composite. كما نرى الصف leaf به عدة دوال لا تعمل وهي خاصة بالصف composite فلن تستطيع في دالة الـ Addchiled ان تضيف الا إذا كنت في صف الـ composite. اما عن دالة Traverse فهي تقوم بعرض القيمة إذا كنت تعرض صف leaf وتقوم باعادة استدعاء نفسها recursive.
using System;
using System.Collections;

//the single interface for primitives & composite types.|

interface Component
{
      void AddChild(Component c);
      void Traverse();
}

//A primitive type.

 class Leaf : Component
{
    private int value = 0;
    public Leaf(int val)
    {
        value = val;
    }
    public void AddChild(Component c)
    {
        //no action; This method is not necessary for Leaf
    }
    public void Traverse()
    {
        Console.WriteLine("Leaf:" + value);
    }
}

//A composite type.

class Composite : Component
{
    private int value = 0;
    private ArrayList ComponentList = new ArrayList();

    public Composite(int val)
    {
        value = val;
    }

    public void AddChild(Component c)
    {
        ComponentList.Add(c);
    }

    public void Traverse()
    {
        Console.WriteLine("Composite:" + value);

        foreach (Component c in ComponentList)
        {
            c.Traverse();
        }
    }
}

class MyMain
{
    public static void Main()
    {
        //creating a TREE structure.
        Composite root = new Composite(100);     // Root
        Composite com1 = new Composite(200);   //Composite 1
        Leaf l1 = new Leaf(10);//Leaf1
        Leaf l2 = new Leaf(20);//Leaf2
        //Add two leafs to composite1
        com1.AddChild(l1);
        com1.AddChild(l2);
        Leaf l3 = new Leaf(30);//Leaf3

        root.AddChild(com1);//Add composite1 to root

        root.AddChild(l3);//Add Leaf3 directly to root
        root.Traverse();//Single method for both types.
    }
}

مراجع 

علم الحاسوب
نماذج تصميم البرمجيات