کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

Design Patterns-الگوی Composite

Composite

در این مقاله آموزشی قرار است راجع به یکی دیگر از الگوهای طراحی با نام Composit آشنا شویم.
در صورتی که مقالات قبلی را مطالعه نکرده اید، از طریق لینک های زیر قابل دسترس هستند:


بنا بر تعریف گروه GOF:" با استفاده از این الگو، اشیاء یک ساختار درختی تشکیل می دهند، تا یک نمایش سلسله مراتبی جزء به کل را ارائه دهد. الگوی Composite به client ها اجازه می دهد با اشیاء انفرادی همانطور رفتار کنند که با اشیاء ترکیبی".
اجازه دهید ببینیم کاربرد این الگو کجاست. شرایطی را در نظر بگیرید که یکسری داده به صورت سلسله مراتبی در اختیار داریم که در آن اشیاء منفرد به صورت برگ و اشیاء ترکیبی به صورت غیر برگ هستند و در هر دو حالت به یک شکل با آنها رفتار می شود. در این صورت باید از الگوی Composite استفاده کرد.
برای مثال، ساختار کارمندان یک سازمان را در نظر بگیرید. در این ساختار رئیس یا CEO در راس این درخت قرار دارد و در ادامه دسته ای از مدیران، کارفرمایان و سپس کارمندان جزء.


آموزش Entity 

FrameWork به همراه Design Pattern

در صورتی که CEO، مدیران، کارفرمایان اشیاء مرکب ای باشند که زیردستان خود را مدیریت می کنند، آنگاه کارمندان یا کارمندان جزء اشیاء منفردی هستند که در این ساهتار درختی به صورت برگ ظاهر می شوند.
به عنوان یک مثال دیگر، ساختار file های کامپیوتر در نظر بگیرید. این ساختار سلسله مراتبی از پوشه ی ریشه شروع می شود تا به آخرین فایل های ممکن برسد.
کنترل های فرزند را در فرم های ویندوزی یا تحت وب نیز با الگوی Composite مدیریت می شوند. برای مثال نمونه سلسله مراتبی زیر را در نظر بگیرید:


    Form ->Panel ->TextBox
    Form ->Panel ->Table ->TextBox
    Form ->Table->Label

در زیر نمودار UML الگوی Composite را مشاهده می کنید.


آموزش Entity 

FrameWork به همراه Design Pattern

الگوی Composite از سه جزء کلیدی تشکیل شده است:


  • Component: یک کلاس abstract یا یک اینترفیس است که متدهای موجود در آن توسط تمام اشیاء موجود در ساختار سلسله مراتبی، پیاده سازی می شوند.
  • Composite: در این کلاس تمام متدهای مورد نیاز برای مدیریت متدهای فرزندانش نگهداری می شود. برای مثال، متدهایی نظیر Add، Remove، Get و متدهای رایج ای که در Component تعریف شده باشند.
  • Leaf: در این کلاس فقط متدهای رایجی که در Component تعریف شده باشند نگهداری می شود.

چگونگی استفاده از الگوی Composite

با ساخت Component شروع می کنیم که base تمام اشیاء خواهد بود.


///
 

/// The Component 

///
 

public interface IEmployee

{

   void ShowYearsOfExperiance();

} 

در اینترفیس فوق یک متد با نام ShowYearsOfExperience تعریف کرده ایم. این متد برای تمام رده های سازمانی، از مدیر گرفته تا کارمند جزء رایج است.
حال باید کلاس Manager را پیاده سازی کنیم که یک کلاس Composite خواهد بود.


///
 

/// The Composite 

///
 

public class Manager: IEmployee  

{ 

   private string _empName 

   { 

       get; 

       set; 

   } 

   private float _yearsOfExperiance 

   { 

       get; 

       set; 

   } 

   private List subordinates = newList (); 

   public Manager(string empName, float yearsOfExperiance) 

   { 

       this._empName = empName; 

       this._yearsOfExperiance = yearsOfExperiance; 

   } 

   public void ShowYearsOfExperiance() 

   { 

       Console.WriteLine("Manager {0} has {1} number of years of experiance", _empName, _yearsOfExperiance); 

       foreach(IEmployee emp in subordinates) 

       { 

           emp.ShowYearsOfExperiance(); 

       } 

   } 

   public void AddSubordinate(IEmployee emp) 

   { 

       subordinates.Add(emp); 

   } 

   public void RemoveSubordinate(IEmployee emp) 

   { 

       subordinates.Remove(emp); 

   } 

} 

در کلاس composite فوق یکسری متد برای مدیریت عملیات مربوط به زیر دستان وجود دارد که این متدها جدا از پیاده سازی متد رایج تعریف شده در IEmployee (ShowYearsOfExperiance) است.
نوبت به پیاده سازی اشیاء Leaf می رسد، یعنی کارمندان جزء (JuniorEmployee).


///
 

/// The Leaf 

///
 

public class JuniorEmployee:IEmployee  

{ 

   private string _empName  

   { 

       get; 

       set; 

   } 

   private float _yearsOfExperiance { 

       get; 

       set; 

   } 

   public void JuniorEmployee(string empName, float yearsOfExperiance)  

   { 

       this._empName = empName; 

       this._yearsOfExperiance = yearsOfExperiance; 

   } 

   public void ShowYearsOfExperiance()  

   { 

       Console.WriteLine("\tSubordinate {0} has {1} number of years of experiance", _empName, _yearsOfExperiance); 

   } 

}

تا به اینجا تمام اجزاء اصلی ساخته شدند (Component، Composite و Leaf) و حال باید ببنیم که client چطور از آنها استفاده می کند.


Console.Title = "Composite pattern demo"; 

Console.Title = "Composite pattern demo"; 

//Create JuniorEmployee object 

JuniorEmployeejEmp1 = newJuniorEmployee("Ramesh", 2); 

JuniorEmployeejEmp2 = newJuniorEmployee("Suresh", 3); 

JuniorEmployeejEmp3 = newJuniorEmployee("Manoj", 2.5 f); 

//Create Manager object 

Managermanager1 = newManager("Prakash", 8); 

Managermanager2 = newManager("Pankaj", 8.5 f); 

Console.WriteLine("Adding Subordinates..."); 

//Add Subordinate 

manager1.AddSubordinate(jEmp1); 

manager1.AddSubordinate(jEmp2); 

manager2.AddSubordinate(jEmp3); 

//Call the common method which will execute in hierarchical fashion. 

manager1.ShowYearsOfExperiance(); 

manager2.ShowYearsOfExperiance(); 

Console.WriteLine("\nRemoving Subordinates..."); 

//Remove Subordinate 

manager1.RemoveSubordinate(jEmp2); 

manager2.RemoveSubordinate(jEmp3); 

//Call the common method after removal 

manager1.ShowYearsOfExperiance();

خروجی:


آموزش Entity 

FrameWork به همراه Design Pattern

همانطور که در خروجی مشاهده می کنید، با استفاده از الگوی Composite، ساختار کارمندان به صورت سلسله مراتبی نمایش داده شده است.
به خاط داشته باشد، الگوی Composite فرض میکند هم اشیاء مرکب-Composite (Manager) و هم اشیاء منفرد (JuniorEmployee) به یک شکل مورد استفاده و دسترسی قرار گرفته اند. به همین دلیل است که رفتارهای رایج (YearsOfExperiance) از بقیه جدا می شوند و در Component (IComponent) قرار میگیرند.
به طور خلاصه، الگوی Composite زمانی استفاده می شود که نیاز به نمایش سلسله مراتبی اشیاء باشد و با اشیاء منفرد و اشیاء مرکب به یک شکل رفتار می شود.

1395/02/06 7587 1887
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...