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
UML class diagram
 (Das oben Genannte wird aus der "Website für technischen Support für IT-Ingenieure von IT Senka" zitiert)
(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