Skip to content

Latest commit

 

History

History
107 lines (78 loc) · 3.74 KB

Bridge.md

File metadata and controls

107 lines (78 loc) · 3.74 KB

Паттерн Bridge / "Мост"

Авторы: Гарафиева Венера, Егоров Вадим


Мост — это структурный паттерн проектирования, который разделяет один или несколько классов на две отдельные иерархии — абстракцию и реализацию, позволяя изменять их независимо друг от друга.

Проблема

Отделить абстракцию от реализации так, чтобы и то и другое можно было изменять независимо. При использовании наследования реализация жестко привязывается к абстракции, что затрудняет независимую модификацию.

Неудачный пример кода:

class Shape:
    def __init__(self, name):
        self.length = name


class RedTriangle(Shape):
    def __init__(self, name):
        super().__init__(name)


class RedSquare(Shape):
    def __init__(self, name):
        super().__init__(name)


class BlueTriangle(Shape):
    def __init__(self, name):
        super().__init__(name)


class BlueSquare(Shape):
    def __init__(self, name):
        super().__init__(name)

Решение

Правильный код:

class Color:
    def __init__(self):
        self.name = None


class Red(Color):
    def __init__(self):
        self.name = 'red'


class Blue(Color):
    def __init__(self):
        self.name = 'blue'

class Shape:
    def __init__(self, color):
        self.color = color
        self.name = None

    def say_hello(self):
        print(
            "Hello, I'm " + self.name +
            " and my color is " +
            self.color.name
        )

class Circle(Shape):
    def __init__(self, color):
        self.color = color
        self.name = 'Circle'
        
if __name__ == '__main__':
    red_circle = Circle(Red())
    red_circle.say_hello()

    blue_circle = Circle(Blue())
    blue_circle.say_hello()

Вывод: Hello, I'm Circle and my color is red Hello, I'm Circle and my color is blue

Преимущество

  1. Позволяет строить платформо-независимые программы.
  2. Скрывает лишние или опасные детали реализации от клиентского кода.
  3. Реализует принцип открытости/закрытости.

Недостатки

  1. Усложняет код программы из-за введения дополнительных классов.

Применимость

  1. Когда необходимо разделить монолитный класс, который содержит несколько различных реализаций какой-то функциональности
  2. Когда класс нужно расширять в двух независимых плоскостях.
  3. Когда изменения в реализации абстракции не должны сказываться на клиентах, то есть клиентский код не должен перекомпилироваться;
  4. Когда вы хотите, чтобы реализацию можно было бы изменять во время выполнения программы.