За информацията в тази статия или раздел не са посочени източници. Въпросната информация може да е непълна, неточна или изцяло невярна. Имайте предвид, че това може да стане причина за изтриването на цялата статия или раздел. |
Композиция (на английски: 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
|