معرفی الگوی طراحی Composite

معرفی الگوی طراحی Composite

مدت مطالعه : 4 دقیقه

02 اردیبهشت 1402

الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرم‌افزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفه‌جویی در زمان و تولید کد های با کیفیت، توسعه‌پذیر و انعطاف‌پذیر استفاده می‌کنیم. در این مطلب قصد داریم الگوی طراحی Composite را معرفی کنیم.

الگوی طراحی Composite یک الگوی طراحی ساختاری(structural) است که به شما امکان می دهد اشیاء را در ساختارهای درختی ترکیب کنید تا سلسله مراتبی از اشیاء را داشته باشید. هر عنصر از سلسله مراتب می‌تواند خود سلسله مراتبی دیگر از اشیاء باشد. ایده کلیدی پشت الگوی کامپوزیت این است که یک شی می تواند شامل اجزای دیگری به عنوان بخشی از ساختار خود باشد و ساختاری درخت مانند را تشکیل دهد. هر عنصر در این سلسله مراتب میتواند به عنوان یک سلسله مراتبی دیگر عمل کند یا صرفا به عنوان برگ در این درخت ظاهر شود. 

الگوی کامپوزیت از چندین عنصر کلیدی تشکیل شده است:

  1. Component: این یک کلاس واسط یا انتزاعی است که متدهای رایج را برای اشیاء Leaf و Composite تعریف می کند. این کلاس معمولاً شامل متد هایی برای افزودن و حذف مؤلفه های فرزند و همچنین متدی برای انجام برخی عملیات روی شی و فرزندان آن است.
  2. Leaf: این کلاسی است که یک شی واحد را در ساختار درختی نشان می دهد. این کلاس رابط Component را پیاده سازی کرده تا رفتار های یک عضو در درخت را داشته باشد.
  3. Composite: این کلاسی است که یک شی ترکیبی را در ساختار درختی نشان می دهد. این کلاس رابط Component را پیاده سازی می کند و رفتار یک شی ترکیبی را تعریف می کند. این کلاس شامل لیستی از اجزای فرزند است که هر کدام از این اجزاء می تواند شیء برگ(Leaf) یا ترکیبی(Composite) باشد.

الگوی کامپوزیت به شما امکان می دهد ساختارهای پیچیده بسازید در حالی که کد را ساده و قابل فهم نگه می دارد. این الگو راه‌حلی مشابه برای برخورد با اشیاء برگ یا ترکیبی ارائه می‌کند و کار با ساختارهای سلسله مراتبی را آسان تر می کند.

در ادامه یک مثال ساده از الگوی کامپوزیت در سی شارپ آورده شده است:

// 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 را پیاده‌سازی می‌کند و علاوه بر آن متد های اضافی را برای مدیریت مؤلفه‌های فرزند، مانند افزودن یا حذف آنها، ارائه می‌کند. این ویژگی به کد کلاینت اجازه می دهد تا با اشیاء برگ و ترکیبی به طور یکنواخت رفتار کند، و مدیریت سلسله مراتب اشیاء را آسان می‌کند.

برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همه‌ی الگو های طراحی می‌شود، برای شما قرار گرفته است.

design patterns

ایجاد کننده (Creational):الگوی طراحی Factory 
الگوی طراحی Builder 
الگوی طراحی Singleton 
الگوی طراحی Prototype 
الگوی طراحی Abstract Factory 
ساختاری (Structural):الگوی طراحی Adapter 
الگوی طراحی Bridge 
الگوی طراحی Composite 
الگوی طراحی Decorator 
الگوی طراحی Facade 
الگوی طراحی Flyweight 
الگوی طراحی Proxy 
رفتاری (Behavioral):الگوی طراحی Chain of Responsibility 
الگوی طراحی Command 
الگوی طراحی Interpreter 
الگوی طراحی Mediator 
الگوی طراحی Memento 
الگوی طراحی Observer 
الگوی طراحی State 
الگوی طراحی Strategy 
الگوی طراحی Template Method 
الگوی طراحی Visitor 
الگوی طراحی Iterator 
  • اشتراک گذاری:
محمدرضا باباخانی
محمدرضا باباخانی

من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که می‌نویسم بدردتون بخوره.

آخرین مطالب

سرویس مش؛ ساده سازی ارتباطات میکروسرویس و افزایش رؤیت پذیری

در چشم انداز همیشه در حال تحول توسعه نرم افزار، معماری میکروسرویس ها به دلیل مقیاس پذیری، انعطاف پذیری و توسعه پذیری محبوبیت قابل توجهی به دست آورده است. با این حال، با افزایش تعداد میکروسرویس ها در یک برنامه، مدیریت ارتباطات آنها و اطمینان از رؤیت صحیح همه آنها به طور فزاینده ای چالش برانگیز می شود. اینجاست که سرویس مش وارد عمل می شود.

اهمیت محاسبات لبه یا Edge Computing

ا توجه به سرعت تحول فناوری، یکی از مفاهیمی که توجه زیادی را به خود جلب کرده و نحوه تعامل ما با سیستم های دیجیتال را تغییر می دهد، محاسبات لبه (Edge Computing) است.

معماری رویداد محور چیست؟

معماری رویداد محور (EDA) یک الگوی طراحی نرم افزار است که در توسعه نرم افزار های مدرن به طور چشمگیری محبوب شده است. در این معماری، جریان داده ها با وقوع رویدادها تعیین می شود. بر خلاف سیستم های متمرکز سنتی که دائماً در حال بررسی وضعیت جدید هستند. معماری رویداد محور به ویژه برای سیستم هایی مفید است که به پردازش حجم زیادی از داده ها بصورت بلادرنگ(real-time) نیاز دارند.

ثبت دیدگاه