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

    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.

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *