Command Pattern in Python
Turn a request into an object you can queue, log or undo, like a light switch with an undo button.
- Commands with execute() and undo()
- Invoker, command and receiver
- Building an undo history
- 1
remoteInvoker - 2
LightCommandCommand - 3
light.on()Receiver: Light on
A request you can store
Command è un design pattern che incapsula una richiesta in un oggetto a sé. Così puoi salvare le richieste in una lista, eseguirle più tardi, tenerne la cronologia o offrire la funzione annulla (undo). Chi invia la richiesta non deve nemmeno sapere chi la eseguirà.
Punti chiave
- A command object knows its receiver and the action to run.
- The invoker calls
execute()without knowing the details. - Keeping executed commands in a list makes undo possible.
Quando si usa?
- Risolvere problemi ricorrenti di progettazione a oggetti con strutture collaudate.
- Disaccoppiare le responsabilità per rendere il codice più facile da estendere e testare.
- Usare un vocabolario di progettazione condiviso nelle discussioni di architettura con il team.
Codice di esempio
class Light:
# Command: package a request as an object for later execution.
def on(self): return "Light on"
def off(self): return "Light off"
class LightCommand:
def __init__(self, light, action):
self.light, self.action = light, action
def execute(self):
# Store a request as data that can be invoked later.
return getattr(self.light, self.action)()
light = Light()
for command in [LightCommand(light, "on"), LightCommand(light, "off")]:
print(command.execute())
Risultato dell'esecuzione
Light on
Light off
Spiegazione del codice
Ogni LightCommand conserva un oggetto Light e il nome dell'operazione da eseguire, come on o off. Il metodo execute() usa getattr() per chiamare il metodo corrispondente di Light. Il ciclo esegue i due comandi uno dopo l'altro e stampa Light on e poi Light off.
Modifica i valori ed esegui il programma nel compilatore Python online CodeUtility senza installare Python.
Esercizi di approfondimento
Prova a modificare il codice seguendo i suggerimenti qui sotto. Cambiare il codice e osservare il risultato ti aiuta a capire molto più che leggerlo soltanto.
- Sostituisci il dominio di esempio mantenendo la struttura del pattern.
- Confronta il pattern con un’implementazione più semplice e spiegane i compromessi.
- Scrivi test per ogni partecipante prima di aggiungere un’altra implementazione.
Esercitati con una sfida
Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.
Tutte le sfide