ООП для чайников. Паттерны проектирования. Компоновщик (composite)

Следующий паттерн, - компоновщик (composite), тоже из группы структурирующих.

Компоновщик организует объекты в древовидные структуры для представления иерархии часть-целое. Всевозможные иерархии деревьев страниц в каталогах, файлов в папках являются яркими представителями паттерна Компоновщик.

Диаграмма для Компоновщика, выглядит так:

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
 
 

Comments

comments


Bookmark and Share