[GO] Lernen Sie das Entwurfsmuster "Mediator" mit Python

Ich möchte GoF-Entwurfsmuster in Python lernen.

■ Mediator (Mediatormuster)

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

■ Beispielprogramm "Mediator"

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.

  • Angenommen, es gibt einen Benutzer mit dem Benutzernamen "hoge" und dem Passwort "fuga".
  • ** "Login Button" ** wird aktiv, wenn Benutzername und Passwort eingegeben werden
  • ** Klicken Sie auf "Anmeldeschaltfläche" **, um festzustellen, ob die Benutzerauthentifizierung erfolgreich war

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.

(Fall 1) Die Benutzerauthentifizierung schlägt fehl, indem ein falsches Kennwort angegeben wird

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!!

(Fall 2) Die Benutzerauthentifizierung schlägt fehl, weil das Kennwort nicht angegeben wurde.

Benutzerauthentifizierung fehlgeschlagen, da ** "Anmeldeschaltfläche" ** nicht aktiviert war.

$ python Main.py hoge
Login Failed!!

(Fall 3) Die Benutzerauthentifizierung ist erfolgreich, indem der richtige Benutzername und das richtige Kennwort angegeben werden.

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.

■ Details zum Beispielprogramm

Ä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

(1) Die Rolle des Mediators (Mediator, Mediator)

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

(2) Die Rolle von ConcreteMediator (konkreter Mediator, Mediator)

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

(3) Die Rolle des Kollegen

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)

(4) Die Rolle des Concrete College

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

(5) Die Rolle des Kunden

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)

■ Referenz-URL

Recommended Posts