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 *