Следующий паттерн, – компоновщик (composite), тоже из группы структурирующих.
Компоновщик организует объекты в древовидные структуры для представления иерархии часть-целое. Всевозможные иерархии деревьев страниц в каталогах, файлов в папках являются яркими представителями паттерна Компоновщик.
Диаграмма для Компоновщика, выглядит так:
Реализовывая Компоновщик, нужно помнить о том чтобы интерфейс Component был максимально дополнен используемыми публичными методами, избавляя клиента от приведения к типу или проверки существования метода (в случае скриптовых языков). Также? стоит сразу позаботиться о максимально удобном функционале для управления элементами (помимо стандартных Add, Remove, GetChildIn).
Пример реализации на Python:
class TreeItem:
def __init__(self, name):
self.items = []
self.name = name
self.current = 0
def __iter__(self):
return self
def add(self, item):
self.items.append(item)
return item
def remove(self, name):
self.items = [i for i in self.items if i.name != name]
def __len__(self):
return len(self.items)
def get(self, i):
return self.items[i]
def next(self):
self.current += 1
if len(self.items) >= self.current:
return self.items[self.current-1]
else:
raise StopIteration
if __name__ == '__main__':
root = TreeItem('/')
root.add(TreeItem("folder1"))
print root.get(0).name
root.remove("folder1")
root.add(TreeItem("folder2")).add(TreeItem("folder21"))
root.add(TreeItem("folder3")).add(TreeItem("folder31").add(TreeItem("folder311")))
def walk(item, level):
for i in range(level):
print(" "),
print(item.name)
for i in item:
walk(i, level + 1)
walk(root, 0)
-----------------------------
folder1
/
folder2
folder21
folder3
folder311