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

от Уикипедия, свободната енциклопедия
Направо към: навигация, търсене
UML диаграма на шаблона Композиция.

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


Съдържание

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

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

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

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[редактиране | edit source]

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