بحث هذه المدونة الإلكترونية

الثلاثاء، 1 يونيو 2010

Composite Pattern







Composite Pattern

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

وتتكون تلك العناصر من صنفين الاول يكون حاوية ويحتوي على عناصر اما من نفس نوعه او من نوع قابل للتشغيل.


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

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

هذا بالظبط مفهوم ال composite pattern.
مثال عملي:



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.
    }
}

قمنا اولا بعمل interface واسميناه component وهذا الانتيرفيس سنشتق منه كلاسيين نعمل عليهما اولهما هو Leaf  وهو العنصر الاصغر الذي يتكون منه العنصر الثاني وهو Composite 

كما نرى الكلاس leaf به عدة دوال لا تعمل وهيخاصة باكلاس composite فلن تستطيع في دالة ال Addchiled ان تضيف الا اذا كنت في كلاس ال composite 
اما عن دالة Traverse فهي تقوم بعرض القيمةاذا كنت تعرض كلاس leaf وتقوم باعداة استدعاء نفسها recursive




ليست هناك تعليقات:

إرسال تعليق