Kommando (designmönster)

Inom objektorienterad programmering är kommando ett designmönster där ett objekt används för att kapsla in all information som behövs för att utföra en åtgärd eller starta en händelse senare. Denna information inkluderar metodens namn, objektet som äger metoden och värden till metodens parametrar.

Fyra termer som alltid associeras med designmönster kommando, mottagare, anropare och klient. Ett kommandoobjekt känner till mottagaren och anropar en metod från mottagare. Värdena till parametrarna i mottagaren lagras i kommandot. Mottagaren utför sedan arbetet. Ett anroparobjekt vet hur ett kommando ska utföras och kan även, men inte nödvändigtvis, bokföra alla kommandon som utförs. Anroparen känner inte till om ett konkret kommando; den känner bara till kommandogränssnittet. Ett klientobjekt håller i både ett anroparobjekt och flera kommandoobjekt. Klienten bestämmer vilka kommandon som ska utföras vid vilka tidpunkter. För att utföra ett kommando överlämnas det från kommandoobjektet till anroparobjektet.

Med kommandoobjekt blir det enklare att skapa allmänna komponenter som behövs för att delegera, sekvensera eller utföra metodanrop vid en vald tidpunkt utan att behövs känna till metodens klass eller parametrar. Med hjälp av ett anroparobjekt kan alla kommandoutföranden bokföras, såväl som att implementera olika lägen för kommandon som hanteras av anroparobjektet, utan att klienten behöver känna till kommandobokföringen eller lägena.

Exempel

I detta exempel konfigurerar vi strömbrytaren (variabeln Switch) med två kommandon: slå på och slå av ljuset.

Javascript

Följande kod är en implementering av designmönstret i Javascript.

/* Anropningsfunktion */
var Switch = function(){
    var _commands = [];
    this.storeAndExecute = function(command){
        _commands.push(command);
        command.execute();
    }
}

/* Mottagarfunktion */
var Light = function(){
    this.turnOn = function(){ console.log ('turn on') };
    this.turnOff = function(){ console.log ('turn off') };
}

/* Kommando för att slå på ljuset - ConcreteCommand #1 */
var FlipUpCommand = function(light){
    this.execute = function() { light.turnOn() };
}

/* Kommandot för att slå av ljuset - ConcreteCommand #2 */
var FlipDownCommand = function(light){
    this.execute = function() { light.turnOff() };
}

var light = new Light();
var switchUp = new FlipUpCommand(light);
var switchDown = new FlipDownCommand(light);
var s = new Switch();

s.storeAndExecute(switchUp);
s.storeAndExecute(switchDown);