forked from pkolt/design_patterns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
composite.py
74 lines (52 loc) · 1.8 KB
/
composite.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# coding: utf-8
"""
Компоновщик (Composite) - паттерн, структурирующий объекты.
Компонует объекты в древовидные структуры для представления иерархий часть-целое.
Позволяет клиентам единообразно трактовать индивидуальные и составные объекты.
"""
# Класс представляющий одновременно примитивы и контейнеры
class Graphic(object):
def draw(self):
raise NotImplementedError()
def add(self, obj):
raise NotImplementedError()
def remove(self, obj):
raise NotImplementedError()
def get_child(self, index):
raise NotImplementedError()
class Line(Graphic):
def draw(self):
print 'Линия'
class Rectangle(Graphic):
def draw(self):
print 'Прямоугольник'
class Text(Graphic):
def draw(self):
print 'Текст'
class Picture(Graphic):
def __init__(self):
self._children = []
def draw(self):
print 'Изображение'
# вызываем отрисовку у вложенных объектов
for obj in self._children:
obj.draw()
def add(self, obj):
if isinstance(obj, Graphic) and not obj in self._children:
self._children.append(obj)
def remove(self, obj):
index = self._children.index(obj)
del self._children[index]
def get_child(self, index):
return self._children[index]
pic = Picture()
pic.add(Line())
pic.add(Rectangle())
pic.add(Text())
pic.draw()
# Изображение
# Линия
# Прямоугольник
# Текст
line = pic.get_child(0)
line.draw() # Линия