Apprenez le modèle de conception "Adapter" avec Python

En tant que matériel d'apprentissage des modèles de conception du GoF, le livre «Introduction aux modèles de conception appris dans le langage Java augmenté et révisé» semble être utile. Cependant, comme les exemples repris sont basés sur JAVA, j'ai essayé la même pratique avec Python pour approfondir ma compréhension.

■ Adaptateur (modèle d'adaptateur)

Le modèle d'adaptateur (modèle d'adaptateur) est l'un des modèles de conception définis par GoF (Gang of Four; 4 gangs). Le modèle d'adaptateur vous permet de changer l'interface sans modifier les classes existantes. Il existe "** méthode utilisant l'héritage " et " méthode utilisant la délégation **" comme méthode pour réaliser le modèle d'adaptateur.

UML class diagram W3sDesign_Adapter_Design_Pattern_UML.jpg

1. Adaptateur utilisant l'héritage

L'adaptateur utilisant l'héritage est réalisé en créant une sous-classe de la classe que vous souhaitez utiliser et en implémentant l'interface nécessaire pour cette sous-classe. inheritence.png

2. Adaptateur utilisant la délégation

L'adaptateur utilisant la délégation est réalisé en créant une instance de la classe que vous souhaitez utiliser et en utilisant cette instance d'une autre classe. delegation.png (Ce qui précède est cité sur Wikipedia)

■ Exemple de programme "Adapter"

En fait, je voudrais exécuter un exemple de programme qui utilise le modèle d'adaptateur et vérifier le comportement suivant.

--Afficher les chaînes de caractères entre parenthèses --Afficher avec * avant et après la chaîne de caractères

$ python Main.py 
(Hello)
*Hello*

■ Détails de l'exemple de programme

Un code similaire a été téléchargé dans le référentiel Git. https://github.com/ttsubo/study_of_design_pattern/tree/master/Adapter

.
├── Main.py
└── adapter
    ├── __init__.py
    ├── banner.py
    ├── print.py
    └── print_banner.py

(1) Rôle de la cible

Le rôle Target définit l'interface impliquée dans le comportement de l'instance. Dans l'exemple de programme, la classe Print remplit ce rôle.

adapter/print.py


from abc import ABCMeta, abstractmethod

class Print(metaclass=ABCMeta):
    @abstractmethod
    def printWeak(self):
        pass

    @abstractmethod
    def printStrng(self):
        pass

(2) Le rôle du client

C'est un rôle de travailler en utilisant la méthode du rôle de Target. Dans l'exemple de programme, la méthode startMain remplit ce rôle.

Main.py


from adapter.print_banner import PrintBanner

def startMain():
    p = PrintBanner("Hello")
    p.printWeak()
    p.printStrng()

if __name__ == '__main__':
    startMain()

(3) Le rôle d'Adaptee

Ici, nous implémentons la méthode qui fonctionne réellement dans le rôle de ʻAdapter. Dans l'exemple de programme, la classe Banner` remplit ce rôle.

adapter/banner.py


class Banner(object):
    def __init__(self, string):
        self.__string = string

    def showWithParen(self):
        print("({0})".format(self.__string))

    def showWithAster(self):
        print("*{0}*".format(self.__string))

(4) Rôle de l'adaptateur (côté raccord)

Le rôle ʻAdapterest une classe qui implémente l'interface pour le rôleTarget. Dans l'exemple de programme, la classe PrintBanner` remplit ce rôle. Il existe les deux méthodes suivantes pour réaliser le modèle d'adaptateur.

--Méthode utilisant l'héritage --Méthode utilisant la délégation

□ Exemple de programme utilisant l'héritage

adapter/print_banner.py


from adapter.banner import Banner
from adapter.print import Print

class PrintBanner(Banner, Print):
    def __init__(self, string):
        super(PrintBanner, self).__init__(string)

    def printWeak(self):
        self.showWithParen()

    def printStrng(self):
        self.showWithAster()

□ Exemple de programme utilisant la délégation

adapter/print_banner.py


from adapter.banner import Banner
from adapter.print import Print

class PrintBanner(Print):
    def __init__(self, string):
        self.__banner = Banner(string)

    def printWeak(self):
        self.__banner.showWithParen()

    def printStrng(self):
        self.__banner.showWithAster()

■ URL de référence

Recommended Posts

Apprenez le modèle de conception "Adapter" avec Python
Apprenez le modèle de conception "Prototype" avec Python
Apprenez le modèle de conception "Builder" avec Python
Apprenez le modèle de conception "Flyweight" en Python
Apprenez le modèle de conception "Observer" en Python
Apprenez le modèle de conception "Memento" avec Python
Apprenez le modèle de conception "Proxy" en Python
Apprenez le modèle de conception "Commande" en Python
Apprenez le modèle de conception "Visiteur" avec Python
Apprenez le modèle de conception "Bridge" avec Python
Apprenez le modèle de conception "Mediator" avec Python
Apprenez le modèle de conception "Décorateur" avec Python
Apprenez le modèle de conception "Iterator" avec Python
Apprenez le modèle de conception «Stratégie» avec Python
Apprenez le modèle de conception "Composite" avec Python
Apprenez le modèle de conception "État" en Python
Apprenez le modèle de conception "Abstract Factory" avec Python
Apprenez le modèle de conception "Méthode d'usine" en Python
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
Apprenez le modèle de conception "Façade" avec Python
Implémenter le modèle Singleton en Python
Modèle de conception #Adapter
Motif singleton en Python
Modèle de visiteur en Python
Trouver des erreurs en Python
J'ai écrit un modèle de conception dans l'édition Kotlin Adapter
Modèles de conception en Python: introduction
Python Design Pattern - Méthode de modèle
Obtenir l'API arXiv en Python
Python dans le navigateur: la recommandation de Brython
Enregistrez le fichier binaire en Python
Frappez l'API Sesami en Python
Obtenez le chemin du bureau en Python
Obtenez le chemin du script en Python
Dans la commande python, python pointe vers python3.8
Accédez à l'API Web en Python
J'ai écrit la file d'attente en Python
Calculer le mois précédent en Python
Examiner la classe d'un objet avec python
Obtenez le nom d'hôte en Python
Accéder à l'API Twitter avec Python
La première étape de Python Matplotlib
J'ai écrit la pile en Python
Maîtriser le module lowref en Python
Apprenez les bases de Python ① Débutants élémentaires
Charger le SDK Python distant avec IntelliJ
Essayez d'utiliser l'API Wunderlist en Python
Vérifiez le comportement du destroyer en Python
[Python Kivy] À propos de la modification du thème de conception
Apprenez les bases en touchant les variables python
Prenez la somme logique de List en Python (fonction zip)
Modèle de conception du GoF à partir du problème 2. Structure
Afficher Python 3 dans le navigateur avec MAMP
Tweet à l'aide de l'API Twitter en Python
Vérifiez si l'URL existe en Python
Associez l'ensemble de tables dans les modèles de python.py
Exécuter l'interpréteur Python dans le script
Le résultat de l'installation de python sur Anaconda