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

Примери 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

Категория:Шаблони за софтуерен дизайн