Шаблон проектирования моста в Python

Введение Шаблон проектирования моста - это шаблон проектирования конструкций [https://en.wikipedia.org/wiki/Structural_pattern], который отделяет абстракцию от реализации. В этой статье мы рассмотрим мотивацию и реализацию шаблона проектирования моста в Python. Шаблоны проектирования относятся к набору стандартизированных практик или решений общих архитектурных проблем в разработке программного обеспечения. Мотивация, лежащая в основе паттерна дизайна моста. Образец моста предотвращает то, что нужно.

Вступление

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

comments powered by Disqus