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.
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.
Il existe les deux types de modèles d'adaptateur suivants.
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.
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.
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.
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.
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*
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.
Recommended Posts