Adaptateur, Pourquoi utiliser ce patron de conception ?

Dans ce tutoriel, nous appendrons pourquoi utiliser le design pattern Adaptateur.

Nous le définirons puis l’analyserons au travers d’un exemple pratique.

upidev-adaptateur-patron-de-conception-post

Définition :

Adaptateur : Patron de conception structurelle qui permet de convertir l’interface d’une classe en une autre que le client attends. L’adaptateur fait fonctionner un ensemble de classe qui n’auraient pas pu fonctionner sans lui, due à une incompatibilité d’interface.

Exemple pratique :

Nous partons en voyage et souhaitons connecter une lampe qui à une prise européenne à une prise secteur américaine.

Les prises ne sont pas compatibles. Nous devons utiliser un adaptateur pour les relier.

Prise secteur américaine

Commençons par créer, une classe pour simuler la prise secteur.

class USAPowerPlug:

    def __init__(self):
        self.type = "G"

    def connect_to_usa_elec_network(self):
        print("Get electricity from the USA network")

Lampe

Ensuite, nous créeons une classe pour simuler la lampe qui peut se brancher seulement à une prise secteur française.

class MyLamp:

    """
        My lamp is French, I want to use it during my trips
        but can only connect on Europe plugs
    """

    def __init__(self, electricity_plug):
        if electricity_plug.type == "C":
            electricity_plug.connect_to_eu_elec_network()
            print("Plugged ...")
        else:
            print("Power plug is not compatible")

Adaptateur

Afin de rendre la lampe compatible avec une prise secteur étrangère, nous définissons un adaptateur universel.

class Adapter:

    def __init__(self, obj, **adapted_methods):
        """We set the adapted methods in the object's dict"""
        self.obj = obj
        self.__dict__.update(adapted_methods)

    def __getattr__(self, attr):
        """All non-adapted calls are passed to the object
        return getattr(self.obj, attr)

    def original_dict(self):
        """Print original object dict"""
        return self.obj.__dict__

A présent, essayons de brancher la lampe.

def main():
    usapowerplug = USAPowerPlug()

    # I can't plug my lamp, because the plug is not compatible
    onelamp = MyLamp(usapowerplug)

    # Now, I use the adapter and can connect my lamp"""
    frenchpowerplug = Adapter(usapowerplug, type="C", connect_to_eu_elec_network=usapowerplug.connect_to_usa_elec_network)
    lamp = MyLamp(frenchpowerplug)

main()

Conclusion

Ainsi s’achève ce tutoriel, ajoutez ci-nécessaire vos questions en commentaire.

Laisser un commentaire