Рубрики
Без рубрики

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

В этом уроке мы рассмотрим мотивацию, лежащую в основе шаблона проектирования моста, и реализуем его в Python.

Автор оригинала: Usman Malik.

Шаблон проектирования моста с помощью 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, продемонстрировав, как он работает.