Авторы: Гарафиева Венера, Егоров Вадим
Мост — это структурный паттерн проектирования, который разделяет один или несколько классов на две отдельные иерархии — абстракцию и реализацию, позволяя изменять их независимо друг от друга.
Отделить абстракцию от реализации так, чтобы и то и другое можно было изменять независимо. При использовании наследования реализация жестко привязывается к абстракции, что затрудняет независимую модификацию.
Неудачный пример кода:
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
- Позволяет строить платформо-независимые программы.
- Скрывает лишние или опасные детали реализации от клиентского кода.
- Реализует принцип открытости/закрытости.
- Усложняет код программы из-за введения дополнительных классов.
- Когда необходимо разделить монолитный класс, который содержит несколько различных реализаций какой-то функциональности
- Когда класс нужно расширять в двух независимых плоскостях.
- Когда изменения в реализации абстракции не должны сказываться на клиентах, то есть клиентский код не должен перекомпилироваться;
- Когда вы хотите, чтобы реализацию можно было бы изменять во время выполнения программы.