[PYTHON] Entwurfsmuster #Facade

Ich übte Designmuster, um Code zu schreiben, der sich des Designs bewusst war. Andere Entwurfsmuster werden häufig veröffentlicht.

Vorwort

Das Hauptziel ist zu verstehen, wann, was und wie Entwurfsmuster verwendet werden.

Dieses Mal bezog sich das Muster Fassadenmuster auf die Struktur. Was ist Fassade? Fassade fungiert als einfaches Fenster für komplexe Systeme. Das heißt, die große Logik wird zu einem einfachen Funktionsaufruf vereinfacht. Übersicht Das hier erstellte Beispielprogramm erstellt eine Webseite eines Benutzers. Um ein Muster des Fassadenmusters zu erstellen, sind ursprünglich "viele komplizierte und komplizierte Klassen" erforderlich. Um das Beispielprogramm zu verkürzen, betrachten wir jedoch ein einfaches System, das nur aus drei Klassen besteht. Dieses System besteht aus einer Datenbank, die einen Namen von einer E-Mail-Adresse erhält, einer Klasse, die eine HTML-Datei (HTMLWriter) erstellt, und einer Klasse, die eine übergeordnete Schnittstelle als Fassade (PageMaker) bereitstellt.

Gesamtklassendiagramm

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.')

Die Datenbankklasse erhält den Benutzernamen durch Angabe des Datenbanknamens ("maildata").

maildata.ini


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

Die Datendatei, auf die Sie verweisen.

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()

Die HtmlWriter-Klasse erstellt eine einfache Webseite. Geben Sie beim Erstellen einer Instanz einen Writer an und geben Sie HTML an diesen Writer aus.

Die title-Methode gibt den Titel aus, die Absatzmethode gibt den Absatz aus, die Link-Methode gibt den Link aus, die mailto-Methode gibt den Link der E-Mail-Adresse aus und die close-Methode beendet die HTML-Ausgabe.

Diese Klasse verbirgt die Einschränkung, dass die title-Methode zuerst aufgerufen werden muss. Die PageMaker-Klasse, die der Kontaktpunkt ist, wurde geschrieben, um diese Einschränkung zu erfüllen.

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 + 'Willkommen auf der Seite.')
            writer.paragraph('Ich warte auf eine E-Mail.')
            writer.mailto(mailaddr, user_name)
            writer.close()
            print(filename + ' ' + 'is created for' + mailaddr + ' ' + '(' + user_name + ')')
        except IOError as e:
            logging.exception(e)

Die PageMaker-Klasse ist eine Kombination aus der Database-Klasse und der HtmlWriter-Klasse, um eine Webseite für einen bestimmten Benutzer zu erstellen.

Die einzige öffentliche Methode, die in dieser Klasse definiert ist, ist make_welcome_page. Durch Angabe einer E-Mail-Adresse und eines Ausgabedateinamens für diese Methode wird eine Webseite erstellt.

Wenn die Methoden der HtmlWriter-Klasse durcheinander sind, kümmert sich diese PageMaker-Klasse darum ** und zeigt nur eine make_welcome_page-Methode nach außen **. Dies ist ein einfaches Fenster.

main.py


from page_maker import PageMaker


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

if __name__ == '__main__':
    main()

Ausführungsergebnis welcome.html is created [email protected] (Hiroshi Yuki)

welcom.png

Zusammenfassung

Facade stellt sicher, dass Sie sich keine Gedanken über die Komplexität des Aufrufs der Methoden dieser Klassengruppe machen müssen oder wenn die Initialisierungsmethode kompliziert ist, wenn Sie mit einer Gruppe von Klassen arbeiten möchten. Es geht darum, die Anzahl der Schnittstellen zu reduzieren und zu einem einfachen Funktionsaufruf zu kombinieren.

Dadurch löst sich die Verbindung mit der Außenseite und es ist leicht wiederzuverwenden. Mit anderen Worten, es macht es einfach, objektorientierte Informationen zu verbergen.

Referenz

Recommended Posts

Entwurfsmuster #Facade
Entwurfsmuster #Builder
Entwurfsmuster #Adapter
Entwurfsmuster #Decorator
Entwurfsmuster #Observer
Entwurfsmuster #Strategie
Entwurfsmuster #Singleton
Entwurfsmuster #Proxy
[Viererbande] Designmuster lernen - Fassade
Lernen Sie das Designmuster "Facade" mit Python
Fassadenmuster in Java
Entwurfsmuster #Factory-Methode
Entwurfsmuster # Template-Methode
Oreore-Entwurfsmuster: Glokale Variable
Python Design Pattern - Template-Methode
[Viererbande] Designmuster lernen
Grobe Zusammenfassung des GoF-Java-Entwurfsmusters
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Fassadenmuster
Lernen Sie das Entwurfsmuster "Prototype" mit Python
Lernen Sie das Entwurfsmuster "Builder" mit Python
[Viererbande] Design Pattern Learning - Singleton
[Viererbande] Design Pattern Learning --Decorator
[Viererbande] Designmuster lernen --Besucher
Design Muster-Adapter
[Viererbande] Design Pattern Learning - Vermittler
Lernen Sie das Entwurfsmuster "Observer" in Python
Lernen Sie das Entwurfsmuster "Proxy" in Python
Lernen Sie das Entwurfsmuster "Befehl" in Python
[Viererbande] Designmusterlernen --Iterator
GoF-Entwurfsmuster aus dem Problem 2. Struktur
Lernen Sie das Entwurfsmuster "Besucher" mit Python
Lernen Sie das Entwurfsmuster "Bridge" mit Python
Lernen Sie das Entwurfsmuster "Mediator" mit Python
Lernen Sie das Designmuster "Decorator" mit Python
[Viererbande] Design Pattern Learning - Composite
[Viererbande] Designmuster lernen - Prototyp
GoF-Entwurfsmuster aus dem Problem 1. Generation
Lernen Sie das Entwurfsmuster "Iterator" mit Python
[Viererbande] Designmuster lernen - Andenken
[Viererbande] Designmuster lernen - Staat
[Vierergruppe] Design Pattern Learning - Interpreter
[Viererbande] Design Pattern Learning - Builder
Lernen Sie das Entwurfsmuster "Strategie" mit Python
[Viererbande] Designmuster lernen - Brücke
Lernen Sie das Entwurfsmuster "Composite" mit Python
Lernen Sie das Entwurfsmuster "Singleton" mit Python
Lernen Sie das Entwurfsmuster "State" in Python
Lernen Sie das Entwurfsmuster "Adapter" mit Python
[Viererbande] Designmuster lernen --Proxy
[Viererbande] Design Pattern Learning - Strategie
[Viererbande] Designmuster lernen --Adapter
[Viererbande] Design Pattern Learning - Beobachter
[Viererbande] Designmuster lernen - Befehl
GoF-Entwurfsmuster aus dem Problem 3. Verhalten
[Viererbande] Designmuster lernen - Fluggewicht
[Viererbande] Designmusterlernen - Abstract Factory
Lernen Sie das Entwurfsmuster "Abstract Factory" mit Python
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
[Viererbande] Designmuster lernen - Fabrikmethode
Lernen Sie das Entwurfsmuster "Factory Method" in Python
Ich habe ein Designmuster in der Kotlin Prototype Edition geschrieben