Композиция () е структурен шаблон за дизайн, който се използва в обектно-ориентираното програмиране.
Примери 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
Категория:Шаблони за софтуерен дизайн