Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns via C#.pdf
Скачиваний:
154
Добавлен:
17.03.2016
Размер:
13.25 Mб
Скачать

115

Паттерн Composite

Название

Компоновщик

Также известен как

-

Классификация

По цели: структурный По применимости: к объектам

Частота использования

Выше средней - 1 2 3 4 5

Назначение

Паттерн Composite – составляет из объектов древовидные структуры для представления иерархий «часть – целое». Позволяет клиентам единообразно трактовать индивидуальные объекты (листья) и составные объекты (ветки).

Введение

Паттерн Composite используется в первую очередь для построения специальных структур данных, которые в информатике называются – деревьями. Эти структуры данных называются деревьями, потому что их формальные изображения, напоминают деревья из объективной реальности.

Чтобы построить простейшее дерево, можно воспользоваться двумя классами – ArrayList и String. Корень и ветки дерева можно представить экземплярами класса (коллекции) ArrayList, а листья экземплярами класса String. Из корня и веток могут расти как листья, так и другие ветки (аналогично живому дереву). Из листьев ничего произрастать не может.

Но, в виртуальной реальности деревья растут сверху вниз, такая особенность представления «роста» деревьев обусловлена адресацией памяти (ОЗУ). В те времена, когда в программировании не использовались объектно-ориентированные подходы, ветви деревьев представлялись массивами, а листья

116

– элементами этих массивов. Как известно, традиционный массив располагается в памяти начиная с области младших адресов и заканчивается в области старших адресов.

Так, например, может формально выглядеть дерево представления четных и нечетных чисел.

Более детально познакомиться с разновидностями деревьев, способами их построения и обхода, можно в книге Дональда Кнута – Искусство программирования (Глава 2.3. Деревья).

Структура паттерна на языке UML

См. Пример к главе: \008_Composite\001_Composite

117

Структура паттерна на языке C#

class Program

{

static void Main()

{

Component root = new Composite("ROOT"); Component branch1 = new Composite("BR1"); Component branch2 = new Composite("BR2"); Component leaf1 = new Leaf("L1"); Component leaf2 = new Leaf("L2");

root.Add(branch1);

root.Add(branch2);

branch1.Add(leaf1);

branch2.Add(leaf2);

root.Operation();

}

}

abstract class Component

{

protected string name;

public Component(string name)

{

this.name = name;

}

public abstract void Operation();

public abstract void Add(Component component); public abstract void Remove(Component component); public abstract Component GetChild(int index);

}

class Leaf : Component

{

public Leaf(string name) : base(name)

{

}

public override void Operation()

{

Console.WriteLine(name);

}

public override void Add(Component component)

{

throw new InvalidOperationException();

}

public override void Remove(Component component)

{

throw new InvalidOperationException();

}

public override Component GetChild(int index)

{

throw new InvalidOperationException();

}

}

class Composite : Component

{

ArrayList nodes = new ArrayList();

public Composite(string name) : base(name)

{

}

public override void Operation()

{

Console.WriteLine(name);

foreach (Component component in nodes) component.Operation();

}

public override void Add(Component component)

{

nodes.Add(component);

}

public override void Remove(Component component)

{

nodes.Remove(component);

}

public override Component GetChild(int index)

{

return nodes[index] as Component;

}

}

См. Пример к главе: \008_Composite\001_Composite

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]