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

от Уикипедия, свободната енциклопедия
Направо към навигацията Направо към търсенето
Емблема за пояснителна страница Вижте пояснителната страница за други значения на Композиция.

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

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

Съдържание

Примери[редактиране | редактиране на кода]

C++[редактиране | редактиране на кода]

C#[редактиране | редактиране на кода]

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);
        }
    }
}

Java[редактиране | редактиране на кода]

//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