Вступление
Шаблон проектирования мостов - это шаблон проектирования конструкций , который отделяет абстракцию от реализации. В этой статье мы рассмотрим мотивацию и реализацию шаблона проектирования моста в Python.
Шаблоны проектирования относятся к набору стандартизированных практик или решений общих архитектурных проблем в разработке программного обеспечения.
Мотивация, стоящая за шаблоном проектирования моста
Образец моста предотвращает так называемый взрывдекартовой сложности продукта.
Проблема будет очевидна на примере. Предположим, вы реализуете
Airplane . Это может быть военный или коммерческий самолет. Кроме
того, это может быть пассажирский / солдатский или грузовой самолет.
Один из подходов к реализации этого - использование самолетов
MilitaryPassenger , MilitaryCargo , CommercialPassenger и
CommercialCargo
Здесь декартова сложность 2 x 2 = 4 . Это число не является
новаторским в этом масштабе, но когда вы включаете больше классов и
вариаций, оно может расти экспоненциально и очень быстро станет
неуправляемым.
Шаблон Bridge используется, в общем, как мост между классами (
Airplane ) и их характеристиками (пассажирский или грузовой самолет).
Он предпочитает композицию
наследованию
.
Используя шаблон, вы создаете один класс для каждого из типов в разных
категориях. Например, в нашем примере у нас были бы CommercialPlane и
MilitaryPlane как объекты, а CargoCarrier и PassengerCarrier как
отдельные объекты.
Может показаться, что мы сделали не так много, поскольку у нас все еще
есть 4 класса, но представьте это в масштабе. У вас могут быть nPlane
и только CargoCarrier и PassengerCarrier которые вы можете применить
к этим самолетам.
Еще лучше было бы иметь родительские классы - Carrier и Plane . Для
Carrier вы можете создать два дочерних класса: Cargo и Passenger .
Точно так же для Plane два дочерних класса: Military и Commercial
.
Затем вам понадобится способ соединить, или, другими словами, соединить
подклассы Carrier и Plane Вы можете сделать это, передав один из
этих двух классов в качестве значения параметра в конструкторе другого
класса. Реализуя шаблон, мы сможем объединить любой из подклассов.
Наконец, давайте посмотрим, как мы можем реализовать шаблон дизайна моста в Python.
Реализация паттерна проектирования моста в Python
Как я сказал ранее, мы создадим родительский класс Carrier с двумя
абстрактными методами: carry_military() и carry_passenger() . Затем
мы можем создать дочерний класс Cargo который наследуется от Carrier
и реализует carry_military() и carry_commercial() .
Чтобы избежать скользкой дорожки добавления вариаций классов, мы
определим Carrier с помощью двух абстрактных методов -
carry_military() и cary_passenger() .
Класс Carrier дополнительно будет иметь два дочерних класса - Cargo
и Passenger которые наследуют его абстрактные методы и реализуют их:
# Passenger & Cargo Carriers
class Carrier:
def carry_military(self, items):
pass
def carry_commercial(self, items):
pass
class Cargo(Carrier):
def carry_military(self, items):
print("The plane carries ", items," military cargo goods")
def carry_commercial(self, items):
print("The plane carries ", items," commercial cargo goods")
class Passenger(Carrier):
def carry_military(self, passengers):
print("The plane carries ", passengers , " military passengers")
def carry_commercial(self, passengers):
print("The plane carries ", passengers , " commercial passengers")
В том же ключе мы создадим Plane с двумя абстрактными методами -
display_description() и add_objects() , а также с двумя дочерними
классами - Commercial и Military . Мы передадим Carrier
конструктору класса Plane Это мост .
Если самолет является Commercial самолетом, он будет Cargo и
Passenger вернет carry_commercial() , и наоборот.
Количество пассажиров / товаров будет храниться в self.objects которая
передается в качестве параметра carry_commercial() :
# Military & Commercial Planes
class Plane:
def __init__(self, Carrier):
self.carrier = Carrier
def display_description(self):
pass
def add_objects(self):
pass
class Commercial(Plane):
def __init__(self, Carrier, objects):
super().__init__(Carrier)
self.objects = objects
def display_description(self):
self.carrier.carry_commercial(self.objects)
def add_objects(self, new_objects):
self.objects += new_objects
class Military(Plane):
def __init__(self, Carrier, objects):
super().__init__(Carrier)
self.objects = objects
def display_description(self):
self.carrier.carry_military(self.objects)
def add_objects(self, new_objects):
self.objects += new_objects
Наши классы подготовлены и готовы. Теперь настало время , чтобы создать некоторые объекты , и они мост между собой через ранее упомянутый вызов конструктора.
Давайте посмотрим на пример:
cargo = Cargo()
passenger = Passenger()
# Bridging Military and Cargo classes
military1 = Military(cargo , 100)
military1.display_description()
military1.add_objects(25)
military1.display_description()
Здесь мы создали экземпляры объектов для классов Cargo и Passenger
Затем, в вызов конструктора к Military классу, мы прошли cargo
экземпляр. Поскольку это военный самолет, груз считается военным грузом.
Таким образом, метод display_description() распечатает подробную
информацию о военном грузе. Кроме того, мы добавили еще 25 объектов
поверх этой нагрузки:
The plane carries 100 military cargo goods
The plane carries 125 military cargo goods
Точно так же мы можем Passenger классы Military и Passenger:
cargo = Cargo()
passenger = Passenger()
# Bridging Military and Passenger classes
military2 = Military(passenger , 250)
military2.display_description()
military2.add_objects(10)
military2.display_description()
Естественно, метод display_description() определяет количество
перевозимых нами военных пассажиров:
The plane carries 250 military passengers
The plane carries 260 military passengers
Точно так же мы можем связать Commercial и Passenger :
# Bridging Commercial and Passenger
commercial1 = Commercial(passenger , 400)
commercial1.display_description()
commercial1.add_objects(50)
commercial1.display_description()
Что приведет к:
The plane carries 400 commercial passengers
The plane carries 450 commercial passengers
И, наконец, мы можем Cargo классы Commercial и Cargo:
# Bridging Commercial and Cargo
commercial2 = Commercial(cargo, 150)
commercial2.display_description()
commercial2.add_objects(15)
commercial2.display_description()
Что приводит к:
The plane carries 150 commercial cargo goods
The plane carries 165 commercial cargo goods
Заключение
Шаблон проектирования мостов - это шаблон проектирования конструкций, который отделяет абстракцию от реализации. В этой статье мы исследовали мотивацию, лежащую в основе паттерна проектирования моста, и то, как он работает.
Впоследствии мы реализовали шаблон на Python, демонстрируя, как он работает.