Ich übte Designmuster, um Code zu schreiben, der sich des Designs bewusst war. Andere Entwurfsmuster werden häufig veröffentlicht.
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.
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)
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.
Recommended Posts