Выдержка с wikipedia
Делегирование (Delegation) — основной шаблон проектирования, в котором объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту.
Пример на Python
class A:
def f(self):
print('A : вызываем метод f')
def g(self):
print('A : вызываем метод g')
class C:
def __init__(self):
self.A = A()
def f(self):
return self.A.f()
def g(self):
return self.A.g()
c = C()
c.f() #A: вызываем метод f
c.g() #A: вызываем метод g
Композиция - это когда между моделируемыми объектами явно
прослеживается отношение часть - целое
если мы создаем
машину, то на колесо, двигатель, и окна, создается свой
класс, а на машину свой класс и все подклассы из которых
состоит автомобиль будут атрибутами класса авто, таким образом
есть класс контейнер и классы, что являются его элементами.
Заключается он в том, что есть класс-контейнер, он же агрегатор, который включает в себя вызовы других классов. В результате получается, что при создании объекта класса-контейнера, также создаются объекты включенных в него классов.
Композиция это не наследование, наследование предполагает принадлежность к какой-то общности (похожесть), а композиция — формирование целого из частей. Наследуются атрибуты, т. е. возможности, другого класса, при этом объектов непосредственно родительского класса не создается. При композиции же класс-агрегатор создает объекты других классов.
Скажем требуется подсчитать площадь комнаты которую требуется заклеить обоями, не включая в расчет потолок, пол, и площадь тех площадей которые занимают дверь и окна.
"""
Класс "комната" – это класс-контейнер для окон и дверей.
Он должен содержать вызовы класса "окно_дверь".
"""
class WinDoor:
"""Для расчета площади двери и окна"""
def __init__(self, x, y):
self.square = x * y
class Room:
"""
Класс комнаты, для расчета площади комнаты которую
требуется заклеить обоями.
"""
def __init__(self, x, y, z):
"""
Получаем параметры комнаты, и сразу считаем всю площадь,
создаем список в котором будем хранить обьекты площадей которые
треубется исключить из подсчета
"""
self.square = 2 * z * (x + y)
self.wd = []
def addWD(self, w, h):
"""Создаем обьект с площадью которую треб. исключить"""
self.wd.append(WinDoor(w, h))
def workSurface(self):
"""Подсчет финальной площади"""
new_square = self.square
for i in self.wd:
new_square -= i.square
return new_square
r1 = Room(6, 3, 2.7)
print(r1.square) # выведет 48.6
r1.addWD(1, 1)
r1.addWD(1, 1)
r1.addWD(1, 2)
print(r1.workSurface()) # выведет 44.6
Класс WinDoor
создается и используется внутри класса
главного Room
, это и есть композиция.