Шаблон проектирования моста с помощью Python
Вступление
Шаблон проектирования моста – это структурный шаблон проектирования , который отделяет абстракцию от реализации. В этой статье мы рассмотрим мотивацию и реализацию шаблона проектирования моста в Python.
Шаблоны проектирования относятся к набору стандартизированных практик или решений общих архитектурных проблем в программной инженерии.
Мотивация, лежащая в основе Шаблона проектирования моста
Шаблон моста предотвращает то, что называется декартовой сложностью произведения взрывом.
Проблема будет очевидна на примере. Предположим, вы реализуете Самолет
. Это может быть военный или коммерческий самолет. Кроме того, это может быть пассажирский/военный или грузовой самолет.
Одним из подходов к реализации этого является наличие Военного пассажирского
, Военного грузового
, Коммерческого пассажирского
и Коммерческого грузового
самолетов.
Здесь декартово произведение сложности равно 2 x
. Это число не является новаторским в этом масштабе, но когда вы включаете больше классов и вариаций, оно может расти экспоненциально и очень быстро станет неуправляемым.
Шаблон Bridge используется, ну, как bridge между классами ( Самолет
реализация) и их характеристиками (является ли это пассажирский или грузовой самолет). Он предпочитает композицию наследованию .
Используя шаблон, вы создаете один класс для каждого из типов в разных категориях. Например, в нашем примере мы будем иметь Коммерческий самолет
и Военный самолет
в качестве сущностей, а Грузовой перевозчик
и Пассажирский перевозчик
в качестве отдельных сущностей.
Может показаться, что мы не очень много сделали, так как у нас все еще есть 4 класса, но представьте себе это в масштабе. Вы можете иметь запланированные
классы и иметь только Грузового перевозчика
и Пассажирского перевозчика
, которые вы можете применить к этим самолетам.
Еще лучше было бы иметь родительские классы – 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
. Это мост .
Если самолет является Коммерческим
самолетом, то он Грузовой
и Пассажирский
вернет 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
В том же духе мы можем соединить Военные
и Пассажирские
классы:
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
Точно так же мы можем соединить Коммерческие
и Пассажирские
:
# 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
И, наконец, мы можем соединить Коммерческие
и Грузовые
классы:
# 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, продемонстрировав, как он работает.