Design pattern in Python

Command Pattern in Python

Turn a request into an object you can queue, log or undo, like a light switch with an undo button.

  • Avanzato
  • 3 min di lettura
  • 1 esempio eseguibile
Cosa imparerai
  • Commands with execute() and undo()
  • Invoker, command and receiver
  • Building an undo history
LightCommand(light, "on").execute()
  1. 1remoteInvoker
  2. 2LightCommandCommand
  3. 3light.on()Receiver: Light on
undo() calls light.off(): Light off.

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

  1. A command object knows its receiver and the action to run.
  2. The invoker calls execute() without knowing the details.
  3. 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

Esegui codice →
main.py
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())
Crea un pulsante Run per questo esempio

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.

  1. Sostituisci il dominio di esempio mantenendo la struttura del pattern.
  2. Confronta il pattern con un’implementazione più semplice e spiegane i compromessi.
  3. Scrivi test per ogni partecipante prima di aggiungere un’altra implementazione.
Esegui nel compilatore Python →

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