Sobes.tech
Middle

Mi az a 'Parancs' minta (Command)?

sobes.tech MI

Válasz az MI-től

Viselkedésmintázat, amely egy kérést külön objektummá alakít, amely tartalmazza a kérés összes információját. Ez lehetővé teszi az objektumok metódusainak paraméterezését különböző kérésekkel, kérdések sorba állítását vagy naplózását, valamint támogatja az műveletek visszavonását.

A minta fő elemei:

  • Parancs (Command): Egy absztrakt osztály vagy interfész, amely deklarálja a kérés végrehajtására szolgáló metódust.
    // Parancs interfész
    class Command:
        def execute(self):
            pass
    
  • Konkrét Parancs (Concrete Command): Megvalósítja a Command interfészt, és összekapcsolja a fogadót a művelettel. Meghatározza azokat a műveleteket, amelyeket a fogadón végre kell hajtani.
    // Konkrét parancs a fény bekapcsolására
    class LightOnCommand(Command):
        def __init__(self, light):
            self._light = light # Fogadó
    
        def execute(self):
            self._light.on()
    
  • Fogadó (Receiver): Az osztály, amely tudja, hogyan hajtsa végre a tényleges munkát. A példánkban ez a Light.
    // Fogadó - az objektum, amelyen műveleteket hajtanak végre
    class Light:
        def on(self):
            print("Fény bekapcsolva")
    
        def off(self):
            print("Fény kikapcsolva")
    
  • Hívó (Invoker): Az objektum, amely kér egy művelet végrehajtását a parancstól. Nem tudja, melyik konkrét parancsról vagy fogadóról van szó.
    // Hívó - meghívja a parancsot
    class RemoteControl:
        def set_command(self, command):
            self._command = command
    
        def press_button(self):
            self._command.execute()
    
  • Ügyfél (Client): Létrehozza a Concrete Command objektumokat, és összekapcsolja őket a Receiver-rel. Ezután átadja a parancsot az Invoker-nak.
    // Ügyfélkód
    if __name__ == "__main__":
        light = Light() # Fogadó
        light_on_command = LightOnCommand(light) # Konkrét parancs
    
        remote = RemoteControl() # Hívó
        remote.set_command(light_on_command) # Parancs átadása
    
        remote.press_button() # Hívó meghívja a parancsot
    

Előnyök:

  • Elkülöníti a hívót és a fogadót a parancstól.
  • Lehetővé teszi a hívó paraméterezését különböző parancsokkal.
  • Megkönnyíti a műveletek visszavonását vagy ismétlését (a parancsok történetének tárolásával).
  • Lehetővé teszi parancssorok építését és végrehajtásuk naplózását.

Hátrányok:

  • Nagy osztályszámhoz vezethet, ha sok parancs van.