ООП для чайников. Паттерны проектирования. Компоновщик (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

Site Footer

Sliding Sidebar

About Me

About Me

For whom this blog for?

For those who are interested in modern Internet technologies, IT business, startups, management, quality control, personal effectiveness, motivation. Here I write about what is interesting, about problems I faced and solutions I found. I hope it will be interesting to you either.

What motivates me to write?

The desire to improve, to study deeper topics that interest me. Find people with similar problems and tasks, together look for ways out and solutions.

Feel free to contact if you have anything to say to me

Old Flash site with my artistic works and misuc.