[PYTHON] Modèle de conception #Adapter

J'ai pratiqué les modèles de conception afin de pouvoir écrire du code conscient du design. D'autres modèles de conception seront publiés fréquemment.

Préface

L'objectif principal est de comprendre quand, quoi et comment utiliser les modèles de conception. (Je suis nouveau en Java ou dans un langage à typage statique, et je n'ai pas une longue histoire de python, donc je pense qu'il y a des choses qui ne ressemblent pas à Pythonista. Si vous avez des suggestions, apprenez-moi.)

Cette fois, l'adaptateur de modèle lié à la structure.

Qu'est-ce que l'adaptateur

Il existe les deux types de modèles d'adaptateur suivants.

  1. Modèle d'adaptateur par classe (en utilisant l'héritage)
  2. Modèle d'adaptateur par instance (en utilisant la délégation)

Créez une structure de conversion entre les deux classes et convertissez-la afin qu'elle puisse être utilisée à d'autres fins. Apdater est le rôle de la couche intermédiaire, et ceux qui l'utilisent et ceux qui l'utilisent n'ont pas besoin d'en connaître le contenu. Le point est la différence entre le retour en tant que classe et le retour en tant qu'instance.

Aperçu

Héritage par classe Il existe un exemple de programme utilisant le modèle Apache et un exemple de programme par délégation. Les deux affichent la chaîne donnée sous la forme (chaîne) ou \ * chaîne \ *.

La classe Banner a une méthode appelée show_with_paren qui affiche la chaîne de caractères entre parenthèses, et une méthode appelée show_with_paren qui affiche la chaîne de caractères avec les marques \ * avant et après. Supposons que la classe Banner soit une classe existante.

L'interface Print déclare une méthode print_weak pour afficher une chaîne faiblement (entre parenthèses) et une méthode print_strong pour afficher une chaîne fortement.

La classe PrinterBanner joue le rôle d'un adaptateur. Cette classe hérite de la classe Banner fournie et implémente l'interface d'imprimante requise. La classe PrinterBanner agit désormais comme un adaptateur.

Diagramme de classes de modèle d'héritage

Adapter継承

Modèle d'héritage d'adaptateur

banner.py


class Banner():

    def __init__(self, string):
        self.__string = string
        
    def show_with_paren(self):
        print('({0})').format(self.__string))
        
    def show_with_aster(self):
        print('({0})').format(self.__string))

printer.py


from abc import ABCMeta, abstractmethod

class Printer(metaclass=ABCMeta):
  
  @abstractmethod
  def print_weak(self):
      pass

  @abstractmethod      
  def print_strong(self):
      pass    

printer_banner.py


from banner import Banner


class PrinterBanner(Banner)

    def __init__(self, string):
        super().__init__(string)

    def print_weak(self):
        self.show_with_paren()
        
    def print_strong(self):
        self.show_with_aster()

La classe PrintBanner agit comme l'adaptateur.

Héritez de la classe Banner et héritez des méthodes show_with_paren et show_with_aster.

De plus, il implémente les méthodes print_weak et print_strong avec l'interface d'imprimante requise.

main.py


from printer_banner import PrinterBanner

if __name__ == '__main__':
    pb = PrinterBanner('Bye')
    pb.print_weak() 
    pb.print_strong()

Sortie avec print_weak () et print_strong () en utilisant l'interface d'imprimante. Puisque main ne sait pas quel type d'implémentation est la classe PrinterBanner, il est possible de changer l'implémentation de la classe PrinterBanner sans changer la classe principale.

Modèle de délégation d'adaptateur

L'exemple de programme par délégation a le même modèle d'héritage pour Main et Banner. La seule différence est la classe PrintBanner. En d'autres termes, nous utiliserons la classe Banner pour réaliser une classe qui a les mêmes méthodes que la classe Printer.

La classe PrinterBanner contient une instance de la classe Banner dans le champ bannière. Cette instance est créée par le constructeur de la classe PrinterBanner. Ensuite, dans les méthodes print_weak et print_strong, les méthodes show_with_paren et show_with_aster sont appelées via le champ banner.

Si vous utilisez l'héritage, vous appelez les méthodes show_with_paren et show_with_aster héritées de votre superclasse, mais dans le modèle de délégation, vous les appelez via des champs.

Lorsque la méthode print_weak de la classe PrinterBanner est appelée, elle est laissée à la méthode show_with_paren d'une autre instance (instance de Banner) au lieu de la gérer elle-même. Voici la délégation.

Diagramme de classe du modèle de délégation

Adapter 委譲

printer_banner.py


from printer import Printer
from banner import Banner


class PrinterBanner(Printer):

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

     def print_weak(self):
         self.banner.show_with_paren()

     def print_strong(self):
         self.banner.show_with_aster()

Cette fois, il hérite de la classe Printer et appelle d'abord une instance de la classe Banner.

Les méthodes print_weak et print_strong sont implémentées à l'aide des méthodes show_with_paren et show_with_aster pour l'instance appelée.

Seul le libellé est modifié, mais le résultat de sortie est le même.

inheritance/main.py


(Bye)
*Bye*

delegation/main.py


(Hello)
*Hello*

Résumé

Le modèle Adapter couvre la classe existante et crée la classe requise. En d'autres termes, la partie qui devient l'interface est insérée entre les deux pour compenser l'écart entre les deux parties différentes.

Même s'il y a un bogue, nous savons qu'il n'y a pas de bogue dans la classe existante, nous devons donc nous concentrer sur la classe qui joue le rôle d'Adaptateur, ce qui rend la vérification du programme très facile, et que la classe existante Si vous ne connaissez que les spécifications, vous pouvez créer une nouvelle classe.

référence

Recommended Posts

Modèle de conception #Adapter
Modèle de conception #Builder
Modèle de conception #Decorator
Modèle de conception #Observer
Modèle de conception #Facade
Modèle de conception #Strategy
Modèle de conception #Singleton
Modèle de conception #Proxy
Apprenez le modèle de conception "Adapter" avec Python
[Gang of Four] Apprentissage des modèles de conception - Adaptateur
Design Pattern #Factory, méthode
Design Pattern #Template, méthode
J'ai écrit un modèle de conception dans l'édition Kotlin Adapter
Modèle de conception Oreore: variable glocale
Python Design Pattern - Méthode de modèle
[Gang of Four] Apprentissage des modèles de conception
Résumé du modèle de conception Java GoF
Apprenez le modèle de conception "Builder" avec Python
[Gang of Four] Apprentissage des modèles de conception - Décorateur
[Gang of Four] Apprentissage des modèles de conception - Visiteur
Modèle de conception-Adaptateur
[Gang of Four] Apprentissage des modèles de conception - Médiateur
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
[Gang of Four] Apprentissage des modèles de conception - Itérateur
Modèle de conception du GoF à partir du problème 2. Structure
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
Modèle de conception-Itérateur
[Gang of Four] Apprentissage des modèles de conception - Façade
[Gang of Four] Apprentissage des modèles de conception - Composite
[Gang of Four] Apprentissage des modèles de conception - Prototype
Modèle de conception du GoF à partir du problème 1. Génération
Apprenez le modèle de conception "Iterator" avec Python
[Gang of Four] Apprentissage des modèles de conception --Mémento
[Gang of Four] Apprentissage des modèles de conception - État
[Gang of Four] Apprentissage des modèles de conception - Interprétation
[Gang of Four] Apprentissage des modèles de conception - Constructeur
Apprenez le modèle de conception «Stratégie» avec Python
[Gang of Four] Apprentissage des modèles de conception - Pont
Apprenez le modèle de conception "Composite" avec Python
Apprenez le modèle de conception "Singleton" avec Python
Apprenez le modèle de conception "État" en Python
[Gang of Four] Apprentissage des modèles de conception - Proxy
[Gang of Four] Apprentissage des modèles de conception - Stratégie
Apprenez le modèle de conception "Façade" avec Python
[Gang of Four] Apprentissage des modèles de conception --Observer
[Gang of Four] Apprentissage des modèles de conception - Commande
Modèle de conception GoF à partir du problème 3. Comportement
[Gang of Four] Apprentissage des modèles de conception - Poids du vol
[Gang of Four] Apprentissage des modèles de conception - Usine abstraite
Apprenez le modèle de conception "Abstract Factory" avec Python
Apprenez le modèle de conception "Méthode de modèle" en Python
[Gang of Four] Apprentissage des modèles de conception - Méthode d'usine
Apprenez le modèle de conception "Méthode d'usine" en Python
J'ai écrit un modèle de conception dans l'édition Kotlin Prototype