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
Commandinterfé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 Commandobjektumokat, és összekapcsolja őket aReceiver-rel. Ezután átadja a parancsot azInvoker-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.