El patrón de diseño de puente con Python

E

Introducción

El patrón de diseño del puente es un Patrón de diseño estructural, que divide la abstracción de la implementación. En este artículo, cubriremos la motivación y la implementación del patrón de diseño de puentes en Python.

Los patrones de diseño se refieren a un conjunto de prácticas o soluciones estandarizadas a problemas arquitectónicos comunes en la ingeniería de software.

Motivación detrás del patrón de diseño del puente

El patrón de puente evita lo que se llama complejidad del producto cartesiano explosión.

El problema será obvio a través de un ejemplo. Suponga que está implementando un Airplane. Puede ser un avión militar o comercial. Además, puede ser un avión de pasajeros / soldado o de carga.

Un enfoque para implementar esto es tener un MilitaryPassenger, MilitaryCargo, CommercialPassenger y CommercialCargo aviones.

Aquí la complejidad del producto cartesiano es 2 x 2 = 4. Este número no es innovador a esta escala, pero cuando incluye más clases y variaciones, puede aumentar exponencialmente y rápidamente se volverá inmanejable.

El patrón de puente se utiliza, además, como puente entre clases (Airplane implementación) y sus características (es un avión de pasajeros o de carga). Favorece la composición sobre la herencia.

Usando el patrón, crea una clase para cada uno de los tipos en diferentes categorías. Por ejemplo, en nuestro ejemplo, tendríamos un CommercialPlane y MilitaryPlane como entidades, con CargoCarrier y PassengerCarrier como entidades separadas.

Puede que no parezca que hemos hecho mucho ya que todavía tenemos 4 clases, pero imagina esto a escala. Tu puedes tener nPlane clases y solo tengo CargoCarrier y PassengerCarrier que puede aplicar a estos planos.

Una forma aún mejor sería tener clases para padres: Carrier y Plane. Para el Carrier clase principal, puede crear dos clases secundarias: Cargo y Passenger. Del mismo modo, para el Plane clase principal, dos clases secundarias: Military y Commercial.

A continuación, necesitará una forma de conectarse, o en otras palabras, puente Carrier y Plane subclases. Puede hacerlo pasando una de estas dos clases como valor de parámetro en el constructor de la otra clase. Al implementar el patrón, podremos combinar cualquiera de las subclases.

Finalmente, veamos cómo podemos implementar el patrón de diseño de puentes en Python.

Implementación del patrón de diseño de puentes en Python

Como dije antes, crearemos una clase padre Carrier con dos métodos abstractos: carry_military()y carry_passenger(). A continuación, podemos crear una clase secundaria. Cargo que hereda del Carrier clase e implementa el carry_military() y carry_commercial() métodos.

Para evitar la pendiente resbaladiza de agregar variaciones de clases, definiremos un Carrier con dos métodos abstractos – carry_military() y cary_passenger().

los Carrier Además, la clase tendrá dos clases secundarias: Cargo y Passenger que heredan sus métodos abstractos y los implementan:

# 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") 

En la misma línea, crearemos un Plane clase con dos métodos abstractos – display_description() y add_objects(), así como dos clases para niños – Commercial y Military. Pasaremos un Carrier al constructor del Plane clase. Este es el puente.

Si el avión es un Commercial avión, es Cargo y Passenger volverá carry_commercial(), y viceversa.

El número de pasajeros / mercancías se almacenará en el self.objects variable que se pasa como parámetro a la carry_commercial() método:

# 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

Nuestras clases están preparadas y listas. Ahora es el momento de crear algunos objetos y hacer que se conecten entre ellos mediante la llamada al constructor mencionada anteriormente.

Echemos un vistazo a un ejemplo:

cargo = Cargo()
passenger = Passenger()

# Bridging Military and Cargo classes
military1 = Military(cargo , 100)
military1.display_description()
military1.add_objects(25)
military1.display_description()

Aquí, hemos instanciado objetos para el Cargo y Passenger clases. Luego, en una llamada de constructor al Military clase, hemos pasado la cargo ejemplo. Dado que es un avión militar, la carga se considera carga militar.

Por lo tanto, los display_description() El método imprimirá detalles sobre la carga militar. Además, hemos agregado otro 25 objetos encima de esta carga:

The plane carries 100 military cargo goods
The plane carries 125 military cargo goods

En la misma línea, podemos salvar el Military y Passenger clases también:

cargo = Cargo()
passenger = Passenger()

# Bridging Military and Passenger classes
military2 = Military(passenger , 250)
military2.display_description()
military2.add_objects(10)
military2.display_description()

Naturalmente, el display_description() El método da como resultado la cantidad de pasajeros militares que llevamos:

The plane carries 250 military passengers
The plane carries 260 military passengers

Del mismo modo, podemos salvar Commercial y Passenger:

# Bridging Commercial and Passenger
commercial1 = Commercial(passenger , 400)
commercial1.display_description()
commercial1.add_objects(50)
commercial1.display_description()

Lo que resultará en:

The plane carries 400 commercial passengers
The plane carries 450 commercial passengers

Y finalmente, podemos salvar el Commercial y Cargo clases:

# Bridging Commercial and Cargo
commercial2 = Commercial(cargo, 150)
commercial2.display_description()
commercial2.add_objects(15)
commercial2.display_description()

Lo que resulta en:

The plane carries 150 commercial cargo goods
The plane carries 165 commercial cargo goods

Conclusión

El patrón de diseño de puentes es un patrón de diseño estructural, que divide la abstracción de la implementación. En este artículo, hemos explorado la motivación detrás del patrón de diseño de puentes y cómo funciona.

Luego, implementamos el patrón en Python, mostrando cómo funciona el patrón.

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad