Вступление
Шаблон проектирования мостов - это шаблон проектирования конструкций , который отделяет абстракцию от реализации. В этой статье мы рассмотрим мотивацию и реализацию шаблона проектирования моста в 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, демонстрируя, как он работает.