[PYTHON] Modèle de conception #Facade

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 s'il vous plaît.)

Cette fois, le motif de la façade était lié à la structure.

Qu'est-ce que la façade

La façade agit comme une simple fenêtre pour les systèmes complexes. Autrement dit, simplifier la grande logique en un seul appel de fonction simple.

Aperçu

L'exemple de programme créé ici crée la page Web d'un utilisateur. Afin de créer un échantillon de motif de façade, "beaucoup de classes compliquées et complexes" sont à l'origine nécessaires. Cependant, afin de raccourcir l'exemple de programme, nous considérerons un système simple composé de seulement trois classes. Ce système se compose d'une base de données qui obtient un nom à partir d'une adresse e-mail, d'une classe qui crée un fichier HTML (HTMLWriter) et d'une classe qui fournit une interface de haut niveau en tant que façade (PageMaker).

Diagramme de classe global

database.py


from configparser import ConfigParser
import logging


class Database():

    def get_properties(self, dbname):
        filename = dbname + '.ini'
        conf = ConfigParser()
        try:
            conf.read(filename)
            prob = conf['TEST1']
            return prob
        except IOError:
            logging.exception('Warning' + filename + 'is not found.')

La classe Database obtient le nom_utilisateur en spécifiant le nom de la base de données ("maildata").

maildata.ini


[TEST1]
[email protected]=Hiroshi Yuki
[email protected]=Hananko Sato

Le fichier de données que vous référencez.

html_writer.py


class HtmlWriter():

    def __init__(self, writer):
        self.__writer = writer

    def title(self, title):
        self.__writer.write('<!DOCTYPE html> \n')
        self.__writer.write('<html>')
        self.__writer.write('<head>')
        self.__writer.write('<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> \n')
        self.__writer.write('<title>' + title + '</title>')
        self.__writer.write('</head>')
        self.__writer.write('<body> \n')
        self.__writer.write('<h1>' + title + '<h1> \n')

    def paragraph(self, msg):
        self.__writer.write('<p>' + msg + '</p>\n')

    def link(self, href, caption):
        self.paragraph('<a href=\'' + href + '\' >' + caption + '</a>')

    def mailto(self, mailaddr, username):
        self.link('mailto:' + mailaddr, username)

    def close(self):
        self.__writer.write('</body>')
        self.__writer.write('</html>\n')
        self.__writer.close()

La classe HtmlWriter crée une page Web simple. Donnez un rédacteur lors de la création d'une instance et envoyez le code HTML à ce rédacteur.

La méthode title génère le titre, la méthode paragraph génère le paragraphe, la méthode link génère le lien, la méthode mailto génère le lien de l'adresse e-mail et la méthode close met fin à la sortie HTML.

Cette classe masque la contrainte selon laquelle la méthode title doit être appelée en premier. Et la classe PageMaker, qui est le point de contact, est écrite pour se conformer à cette restriction.

page_maker.py


import logging
from html_writer import HtmlWriter
from database import Database


class PageMaker():

    def make_welcome_page(self, mailaddr, filename):
        db = Database()
        try:
            prob = db.get_properties('maildata')
            user_name = prob[mailaddr]
            writer = HtmlWriter(open(filename, mode='w'))
            writer.title('Welcome to ' + user_name + 'is page!')
            writer.paragraph(user_name + 'Bienvenue sur la page.')
            writer.paragraph('J'attends un e-mail.')
            writer.mailto(mailaddr, user_name)
            writer.close()
            print(filename + ' ' + 'is created for' + mailaddr + ' ' + '(' + user_name + ')')
        except IOError as e:
            logging.exception(e)

La classe PageMaker est une combinaison de la classe Database et de la classe HtmlWriter pour créer une page Web pour un utilisateur spécifié.

La seule méthode publique définie dans cette classe est make_welcome_page. Spécifier une adresse e-mail et un nom de fichier de sortie pour cette méthode créera une page Web.

Là où les méthodes de la classe HtmlWriter sont gâchées, cette classe PageMaker s'en charge, ** ne montrant qu'une seule méthode make_welcome_page à l'extérieur **. Ceci est une simple fenêtre.

main.py


from page_maker import PageMaker


def main():
    pm = PageMaker()
    pm.make_welcome_page('[email protected]', 'welcome.html')

if __name__ == '__main__':
    main()

Résultat d'exécution welcome.html is created [email protected] (Hiroshi Yuki)

welcom.png

Résumé

Facade s'assure que si vous souhaitez travailler avec un groupe de classes, vous n'avez pas à vous soucier de la complexité de l'appel des méthodes de ce groupe de classes ou lorsque la méthode d'initialisation est compliquée. Le but est de réduire le nombre d'interfaces et de les combiner en un seul appel de fonction simple.

En conséquence, la connexion avec l'extérieur devient lâche et il devient facile à réutiliser. En d'autres termes, cela permet de masquer facilement les informations orientées objet.

référence

Recommended Posts

Modèle de conception #Facade
Modèle de conception #Builder
Modèle de conception #Adapter
Modèle de conception #Decorator
Modèle de conception #Observer
Modèle de conception #Strategy
Modèle de conception #Singleton
Modèle de conception #Proxy
[Gang of Four] Apprentissage des modèles de conception - Façade
Apprenez le modèle de conception "Façade" avec Python
Modèle de façade en Java
Design Pattern #Factory, méthode
Design Pattern #Template, méthode
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
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de façade
Apprenez le modèle de conception "Prototype" avec Python
Apprenez le modèle de conception "Builder" avec Python
[Gang of Four] Apprentissage des modèles de conception --Singleton
[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 "Observer" en 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
[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
Apprenez le modèle de conception "Adapter" avec Python
[Gang of Four] Apprentissage des modèles de conception - Proxy
[Gang of Four] Apprentissage des modèles de conception - Stratégie
[Gang of Four] Apprentissage des modèles de conception - Adaptateur
[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