Skip to content

Latest commit

 

History

History
126 lines (96 loc) · 4.85 KB

pattern_1.md

File metadata and controls

126 lines (96 loc) · 4.85 KB

Делегирование

Выдержка с 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, это и есть композиция.