Ich möchte GoF-Entwurfsmuster in Python lernen.
Das englische Wort "Mediator" bedeutet "Mediator". Dieses Muster ist ein Muster, das eine einfache und klare Schnittstelle bietet, indem sichergestellt wird, dass die Beziehungen zwischen mehreren eng miteinander verflochtenen Objekten über einen "Vermittler" verarbeitet werden. Mit anderen Worten, das "Mediator" -Muster fungiert als "Mediator", der Anfragen von mehreren Objekten unter seiner Gerichtsbarkeit erhält, geeignete Entscheidungen trifft und Anweisungen für alle oder einen Teil der Objekte unter seiner Gerichtsbarkeit gibt. Es ist ein Muster, das eine Klasse verwendet.
UML class and sequence diagram UML class diagram (Das oben Genannte wird aus der "Website für technischen Support für IT-Ingenieure von IT Senka" zitiert)
Eigentlich möchte ich versuchen, ein Beispielprogramm auszuführen, das das Mediator-Muster verwendet, und das folgende Verhalten überprüfen. Stellen Sie sich hier einen "Benutzerauthentifizierungsbildschirm" </ font> vor.
Wenn Sie im Beispielprogramm das erste Argument angeben: Benutzername und das zweite Argument: Kennwort, ", wird der Benutzerauthentifizierungsbildschirm" </ font> mit dem Benutzernamen angezeigt. Es wird davon ausgegangen, dass Sie das Passwort eingegeben haben.
Der Benutzername wurde korrekt eingegeben, daher wurde ** "Anmeldeschaltfläche" ** aktiviert, aber die Benutzerauthentifizierung ist fehlgeschlagen.
$ python Main.py hoge huga
(Active login button)
(ID/PW is incorrect)
Login Failed!!
Benutzerauthentifizierung fehlgeschlagen, da ** "Anmeldeschaltfläche" ** nicht aktiviert war.
$ python Main.py hoge
Login Failed!!
Da der Benutzername korrekt eingegeben wurde, wurde ** "Anmeldeschaltfläche" ** aktiviert und die Benutzerauthentifizierung war erfolgreich.
$ python Main.py hoge fuga
(Active login button)
(ID/PW is confirmed)
Login Succeed!!
Das Beispielprogramm funktionierte wie erwartet.
Ähnlicher Code wurde in das Git-Repository hochgeladen. https://github.com/ttsubo/study_of_design_pattern/tree/master/Mediator
--Verzeichnisaufbau
.
├── Main.py
└── mediator
├── __init__.py
├── colleague.py
└── mediator.py
Die Rolle "Vermittler" kommuniziert mit der Rolle "Kollege" und definiert die Schnittstelle für Anpassungen. Im Beispielprogramm übernimmt die Klasse "Mediator" diese Rolle.
mediator/mediator.py
from abc import ABCMeta, abstractmethod
class Mediator(metaclass=ABCMeta):
@abstractmethod
def on_change(self, component):
pass
Die Rolle "ConcreteMediator" implementiert die Schnittstelle für die Rolle "Mediator" und nimmt die tatsächlichen Anpassungen vor. Im Beispielprogramm übernimmt die Klasse "ConcreteMediator" diese Rolle.
mediator/mediator.py
class ConcreteMediator(Mediator):
def __init__(self):
self.authentication = False
def setColleagues(self, inputIdObj, inputPwObj, buttonObj):
self.inputIdObj = inputIdObj
self.inputPwObj = inputPwObj
self.buttonObj = buttonObj
def on_change(self, component):
if component.name == "ID" or component.name == "PW":
self.__refreshButton()
elif component.name == "Login":
self.__authentication()
def __refreshButton(self):
if self.inputIdObj.text is not None and self.inputPwObj.text is not None:
print("(Active login button)")
self.buttonObj.active = True
def __authentication(self):
if self.inputIdObj.text == "hoge" and self.inputPwObj.text == "fuga":
print("(ID/PW is confirmed)")
self.authentication = True
else:
print("(ID/PW is incorrect)")
Die Rolle "Kollege" verknüpft die Rolle "Vermittler" mit der Schnittstelle, die kommuniziert. Im Beispielprogramm übernimmt die Klasse "Kollege" diese Rolle.
mediator/colleague.py
from mediator.mediator import Mediator
class Colleague(Mediator):
def __init__(self, mediatorObj, name):
self.mediator = mediatorObj
self.name = name
def on_change(self):
if self.mediator is not None:
self.mediator.on_change(self)
Die Rolle "ConcreteColleague" ist der Rolle "Kollege" zugeordnet. Im Beispielprogramm übernehmen die Klasse "ConcreteColleagueButton" und die Klasse "ConcreteColleagueTextArea" diese Rolle.
mediator/colleague.py
class ConcreteColleagueButton(Colleague):
def __init__(self, mediatorObj, name=None):
super(ConcreteColleagueButton, self).__init__(mediatorObj, name)
self.active = False
def clickButton(self):
if self.active:
self.on_change()
return self.mediator.authentication
def checkButtonStatus(self):
return self.active
class ConcreteColleagueTextArea(Colleague):
def __init__(self, mediatorObj, name=None):
super(ConcreteColleagueTextArea, self).__init__(mediatorObj, name)
self.text = None
def inputText(self, text):
self.text = text
self.on_change()
Im Beispielprogramm übernimmt die Methode "startMain" diese Rolle.
Main.py
import sys
from mediator.mediator import ConcreteMediator
from mediator.colleague import ConcreteColleagueTextArea, ConcreteColleagueButton
def startMain(userid, password):
m = ConcreteMediator()
inputIdObj = ConcreteColleagueTextArea(m, "ID")
inputPwObj = ConcreteColleagueTextArea(m, "PW")
pushButtonObj = ConcreteColleagueButton(m, "Login")
m.setColleagues(inputIdObj, inputPwObj, pushButtonObj)
inputIdObj.inputText(userid)
inputPwObj.inputText(password)
if pushButtonObj.clickButton():
print("Login Succeed!!")
else:
print("Login Failed!!")
def check_input_data(params):
if len(params)==3:
userid = params[1]
password = params[2]
elif len(params)==2:
userid = params[1]
password = None
elif len(params)==1:
userid = None
password = None
return userid, password
if __name__ == "__main__":
userid, password = check_input_data(sys.argv)
startMain(userid, password)
Recommended Posts