Composite Pattern – lucrul unitar cu structuri ierarhice (ex: meniu, fișiere) – C# / .NET

  • Doru Bulubasa
  • 21 November 2025

În multe aplicații .NET apare nevoia de a lucra cu structuri ierarhice: meniuri, directoare și fișiere, componente UI, noduri într-un arbore, categorii de produse etc.

Problema? Uneori trebuie să tratezi obiectele individuale și grupurile de obiecte în același mod.

Aici intervine Composite Pattern, un pattern structural care permite tratarea uniformă a obiectelor simple și a celor compuse. Acesta modelează structuri “arbore” astfel încât clienții să nu fie obligați să știe dacă lucrează cu o frunză sau cu un nod compus.


🎯 De ce este util Composite Pattern

Composite este ideal când avem:

  • structuri arborescente (meniuri, file system, categorii)

  • obiecte care pot conține alte obiecte

  • nevoie de operații uniforme pentru elemente simple și compuse

  • scenarii de recursivitate

Scopul: uniformizare + simplitate.

Clientul apelează aceleași metode, indiferent de tipul nodului.


🧱 Structura Composite Pattern

  1. Component — interfața comună pentru toate obiectele din arbore

  2. Leaf — obiect individual (ex: fișier, element meniu)

  3. Composite — conține alte componente (ex: director, meniu principal)


🧩 Exemplu simplu în C#

Să modelăm un sistem de meniuri:

🟦 Component – interfața comună

public interface IMenuComponent
{
    string Name { get; }
    void Display(int depth = 0);
}

🟩 Leaf – element simplu de meniu

public class MenuItem : IMenuComponent
{
    public string Name { get; }

    public MenuItem(string name)
    {
        Name = name;
    }

    public void Display(int depth = 0)
    {
        Console.WriteLine(new string('-', depth) + Name);
    }
}

🟧 Composite – grup de elemente

public class MenuGroup : IMenuComponent
{
    public string Name { get; }
    private readonly List<IMenuComponent> _children = new();

    public MenuGroup(string name)
    {
        Name = name;
    }

    public void Add(IMenuComponent component) => _children.Add(component);
    public void Remove(IMenuComponent component) => _children.Remove(component);

    public void Display(int depth = 0)
    {
        Console.WriteLine(new string('-', depth) + Name);

        foreach (var child in _children)
            child.Display(depth + 2);
    }
}


▶️ Utilizare

var mainMenu = new MenuGroup("Meniu Principal");
var fileMenu = new MenuGroup("Fișier");
var editMenu = new MenuGroup("Editare");

fileMenu.Add(new MenuItem("Nou"));
fileMenu.Add(new MenuItem("Deschide"));
fileMenu.Add(new MenuItem("Salvează"));

editMenu.Add(new MenuItem("Copiere"));
editMenu.Add(new MenuItem("Lipire"));

mainMenu.Add(fileMenu);
mainMenu.Add(editMenu);

mainMenu.Display();

📌 Output:

Meniu Principal
--Fișier
----Nou
----Deschide
----Salvează
--Editare
----Copiere
----Lipire

Structura se poate extinde recursiv, fără schimbări în codul client.


✔️ Beneficii

  • tratament unitar pentru obiecte simple și compuse

  • extindere facilă (adaugă noduri noi fără a schimba codul existent)

  • modelează elegant structurile arbore

  • reduce codul duplicat


❗ Dezavantaje

  • poate ascunde diferențele între noduri (dacă unele nu ar trebui să aibă copii)

  • crește numărul de clase

  • unele operații pot fi nepotrivite pentru nodurile „leaf”


🔚 Concluzie

Composite Pattern este excelent pentru aplicații care gestionează structuri ierarhice complexe și permite manipularea lor într-un mod elegant, uniform și scalabil. Este des folosit în UI frameworks, sisteme de meniuri, editori grafici, file systems, cataloguri de produse etc.

Scrie un comentariu

Adresa de mail nu va fi publicata. Campurile obligatorii sunt marcate cu *