Композиция (шаблон)
от Уикипедия, свободната енциклопедия
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); } } }