مشخصات مقاله
-
1887
-
0.0
-
7587
-
0
-
0
Design Patterns-الگوی Composite
Composite
در این مقاله آموزشی قرار است راجع به یکی دیگر از الگوهای طراحی با نام Composit آشنا شویم.
در صورتی که مقالات قبلی را مطالعه نکرده اید، از طریق لینک های زیر قابل دسترس هستند:
- Design Patterns
- Singleton Pattern
- Simple Factory Pattern
- Abstract Factory Pattern
- Factory Method Pattern
- Prototype Pattern
- Builder Pattern
- Façade Pattern
- Adapter Pattern
- Decorator Pattern
- Bridge Pattern
بنا بر تعریف گروه GOF:" با استفاده از این الگو، اشیاء یک ساختار درختی تشکیل می دهند، تا یک نمایش سلسله مراتبی جزء به کل را ارائه دهد. الگوی Composite به client ها اجازه می دهد با اشیاء انفرادی همانطور رفتار کنند که با اشیاء ترکیبی".
اجازه دهید ببینیم کاربرد این الگو کجاست. شرایطی را در نظر بگیرید که یکسری داده به صورت سلسله مراتبی در اختیار داریم که در آن اشیاء منفرد به صورت برگ و اشیاء ترکیبی به صورت غیر برگ هستند و در هر دو حالت به یک شکل با آنها رفتار می شود. در این صورت باید از الگوی Composite استفاده
کرد.
برای مثال، ساختار کارمندان یک سازمان را در نظر بگیرید. در این ساختار رئیس یا CEO در راس این درخت قرار دارد و در ادامه دسته ای از مدیران، کارفرمایان و سپس کارمندان جزء.
در صورتی که CEO، مدیران، کارفرمایان اشیاء مرکب ای باشند که زیردستان خود را مدیریت می کنند، آنگاه کارمندان یا کارمندان جزء اشیاء منفردی هستند که در این ساهتار درختی به صورت برگ ظاهر می شوند.
به عنوان یک مثال دیگر، ساختار file های کامپیوتر در نظر بگیرید. این ساختار سلسله مراتبی از پوشه ی ریشه شروع می شود تا به آخرین فایل های ممکن برسد.
کنترل های فرزند را در فرم های ویندوزی یا تحت وب نیز با الگوی Composite مدیریت می شوند. برای مثال نمونه سلسله مراتبی زیر را در نظر بگیرید:
Form ->Panel ->TextBox
Form ->Panel ->Table ->TextBox
Form ->Table->Label
در زیر نمودار UML الگوی Composite را مشاهده می کنید.
الگوی 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();خروجی:
همانطور که در خروجی مشاهده می کنید، با استفاده از الگوی Composite، ساختار کارمندان به صورت سلسله مراتبی نمایش داده شده است.
به خاط داشته باشد، الگوی Composite فرض میکند هم اشیاء مرکب-Composite (Manager) و هم اشیاء منفرد (JuniorEmployee) به یک شکل مورد استفاده و دسترسی قرار گرفته اند. به همین دلیل است که رفتارهای رایج (YearsOfExperiance) از بقیه جدا می شوند و در
Component (IComponent) قرار میگیرند.
به طور خلاصه، الگوی Composite زمانی استفاده می شود که نیاز به نمایش سلسله مراتبی اشیاء باشد و با اشیاء منفرد و اشیاء مرکب به یک شکل رفتار می شود.