Композиция (шаблон)

Вижте пояснителната страница за други значения на Композиция.

UML диаграма на шаблона Композиция.

Композиция (на английски: Composite) е структурен шаблон за дизайн, който се използва в обектно-ориентираното програмиране.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace CompositeDesignPattern
{
    //Стартиращия програмата клас
    class MainApp
    {
        ///главният стартиращ метод
        static void Main()
        {
            // Създай дървовидна структура  създавайки коренът
            Composite root = new Composite("root");
            root.Add(new Leaf("Leaf A"));
            root.Add(new Leaf("Leaf B"));

            //прибавите градивна единица / елемент
            Composite comp = new Composite("Composite X");
            comp.Add(new Leaf("Leaf XA"));
            comp.Add(new Leaf("Leaf XB"));

            //прибави го към коренния елемент
            root.Add(comp);
            root.Add(new Leaf("Leaf C"));

            // прибави и премахни листо от корена
            Leaf leaf = new Leaf("Leaf D");
            root.Add(leaf);
            root.Remove(leaf);

            // Рекурсивно предтави дървото
            root.Display(1);

            // Wait for user
            Console.Read();
        }
    }

    // "Component"
    abstract class Component
    {
        protected string name;

        // Constructor
        public Component(string name)
        {
            this.name = name;
        }

        public abstract void Add(Component c);
        public abstract void Remove(Component c);
        public abstract void Display(int depth);
    }

    // "Composite"
    class Composite : Component
    {
        private ArrayList children = new ArrayList();

        // Constructor
        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);

            // Recursively display child nodes
            foreach (Component component in children)
            {
                component.Display(depth + 2);
            }
        }
    }

    // "Leaf"
    class Leaf : Component
    {
        // Constructor
        public Leaf(string name)
            : base(name)
        {
        }

        public override void Add(Component c)
        {
            Console.WriteLine("Cannot add to a leaf");
        }

        public override void Remove(Component c)
        {
            Console.WriteLine("Cannot remove from a leaf");
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + name);
        }
    }
}
//MainClacc.java
package CompositeDesignPattern;

public class MainClass {

	public static void main(String[] args) {
 // Създай дървовидна структура създавайки коренът
        Composite root = new Composite("root");
        root.Add(new Leaf("Leaf A"));
        root.Add(new Leaf("Leaf B"));

        //прибавите градивна единица / елемент
        Composite comp = new Composite("Composite X");
        comp.Add(new Leaf("Leaf XA"));
        comp.Add(new Leaf("Leaf XB"));

        //прибави го към коренния елемент
        root.Add(comp);
        root.Add(new Leaf("Leaf C"));

        // прибави и премахни листо от корена
        Leaf leaf = new Leaf("Leaf D");
        root.Add(leaf);
        root.Remove(leaf);

        // Рекурсивно предтави дървото
        root.Display(1);

      }
}

//Component.java
public abstract class Component {

	protected String name;

	// Constructor
	public Component(String name){
		this.name = name;
	}

	public abstract void Add(Component c);
	public abstract void Remove(Component c);
	public abstract void Display(int depth);
}

//Composite.java
import java.util.ArrayList;

public class Composite extends Component{

	private ArrayList<Component> children = new ArrayList<>();

	// Constructor
	public Composite(String name) {
		super(name);
	}

	@Override
	public void Add(Component c) {
		children.add(c);

	}

	@Override
	public void Remove(Component c) {
		children.remove(c);

	}

	@Override
	public void Display(int depth) {
		for(int i = 0;i<depth;i++)
			System.out.print(new String("-"));
		System.out.println(name);
 // Recursively display child nodes
		for(Component c : children){
			c.Display(depth + 2);
		}
	}
}

//Leaf.java
public class Leaf extends Component{

	public Leaf(String name) {
		super(name);

	}

	@Override
	public void Add(Component c) {
		System.out.print("Cannot add to a leaf");

	}

	@Override
	public void Remove(Component c) {
		System.out.print("Cannot remove to a leaf");

	}

	@Override
	public void Display(int depth) {
		for(int i = 0;i<depth;i++)
			System.out.print(new String("-"));
		System.out.println(name);

	}

}

//Result:

-root
---Leaf A
---Leaf B
---Composite X
-----Leaf XA
-----Leaf XB
---Leaf C