الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرمافزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفهجویی در زمان و تولید کد های با کیفیت، توسعهپذیر و انعطافپذیر استفاده میکنیم. در این مطلب قصد داریم الگوی طراحی Composite را معرفی کنیم.
الگوی طراحی Composite یک الگوی طراحی ساختاری(structural) است که به شما امکان می دهد اشیاء را در ساختارهای درختی ترکیب کنید تا سلسله مراتبی از اشیاء را داشته باشید. هر عنصر از سلسله مراتب میتواند خود سلسله مراتبی دیگر از اشیاء باشد. ایده کلیدی پشت الگوی کامپوزیت این است که یک شی می تواند شامل اجزای دیگری به عنوان بخشی از ساختار خود باشد و ساختاری درخت مانند را تشکیل دهد. هر عنصر در این سلسله مراتب میتواند به عنوان یک سلسله مراتبی دیگر عمل کند یا صرفا به عنوان برگ در این درخت ظاهر شود.
الگوی کامپوزیت از چندین عنصر کلیدی تشکیل شده است:
الگوی کامپوزیت به شما امکان می دهد ساختارهای پیچیده بسازید در حالی که کد را ساده و قابل فهم نگه می دارد. این الگو راهحلی مشابه برای برخورد با اشیاء برگ یا ترکیبی ارائه میکند و کار با ساختارهای سلسله مراتبی را آسان تر می کند.
در ادامه یک مثال ساده از الگوی کامپوزیت در سی شارپ آورده شده است:
// Component
public abstract class Component
{
public string Name { get; set; }
public Component(string name)
{
Name = name;
}
public abstract void Add(Component component);
public abstract void Remove(Component component);
public abstract void Display(int depth);
}
// Leaf
public class Leaf : Component
{
public Leaf(string name) : base(name) { }
public override void Add(Component component)
{
Console.WriteLine("Cannot add to a leaf.");
}
public override void Remove(Component component)
{
Console.WriteLine("Cannot remove from a leaf.");
}
public override void Display(int depth)
{
Console.WriteLine(new string('-', depth) + " " + Name);
}
}
// Composite
public class Composite : Component
{
private List<Component> _children = new List<Component>();
public Composite(string name) : base(name) { }
public override void Add(Component component)
{
_children.Add(component);
}
public override void Remove(Component component)
{
_children.Remove(component);
}
public override void Display(int depth)
{
Console.WriteLine(new string('-', depth) + "+ " + Name);
foreach (Component component in _children)
{
component.Display(depth + 2);
}
}
}
// Client
public class Client
{
public void Main()
{
// Create a tree structure
Composite root = new Composite("Root");
root.Add(new Leaf("Leaf A"));
root.Add(new Leaf("Leaf B"));
Composite composite = new Composite("Composite X");
composite.Add(new Leaf("Leaf XA"));
composite.Add(new Leaf("Leaf XB"));
root.Add(composite);
root.Add(new Leaf("Leaf C"));
// Add and remove a leaf
Leaf leaf = new Leaf("Leaf D");
root.Add(leaf);
root.Remove(leaf);
// Recursively display tree
root.Display(1);
}
}
در این مثال، کلاس Component متدهای رایج را برای اشیاء برگ و ترکیبی تعریف می کند. کلاس Leaf یک شی منفرد را در ساختار درختی نشان می دهد، در حالی که کلاس Composite یک شی ترکیبی را نشان می دهد که می تواند شامل یک یا چند فرزند باشد. کلاس Composite متدهای رایج کلاس Component را پیادهسازی میکند و علاوه بر آن متد های اضافی را برای مدیریت مؤلفههای فرزند، مانند افزودن یا حذف آنها، ارائه میکند. این ویژگی به کد کلاینت اجازه می دهد تا با اشیاء برگ و ترکیبی به طور یکنواخت رفتار کند، و مدیریت سلسله مراتب اشیاء را آسان میکند.
برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همهی الگو های طراحی میشود، برای شما قرار گرفته است.
من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که مینویسم بدردتون بخوره.
ثبت دیدگاه