Il Command pattern è basato sui dati e rientra nella categoria Comportamentali.

Command

Il suo principio è molto semplice: una richiesta viene racchiusa sotto un oggetto come comando e passata all’oggetto invocatore. L’oggetto Invoker cerca la classe appropriata in grado di gestire la richiesta e passa il comando all’oggetto corrispondente che lo esegue.

 

DIAGRAMMA UML

 

IMPLEMENTAZIONE COMMAND

Creiamo un’interfaccia Ordine che funge da comando, dopo di chè creiamo una classe magazzino che funge da richiesta. Inoltre creiamo le classi concrete Compra e Vendi che implementano l’interfaccia Ordine, la quale eseguirà la vera elaborazione dei comandi.

Infine, creiamo la classe command che funge da invoker, la classe può prendere ed effettuare ordini. La classe identifica l’oggetto  che eseguirà il comando in funzione del tipo.

Step 1: Creiamo l’interfaccia Ordine

public interface Ordine {
    void esegui();
}

Step 2: Creiamo la classe Magazzino, che funge da richiesta

public class Magazzino {

    private String nome = "Prodotto_1";
    private int quantità = 25;

    public void compra(){
        System.out.println("[MAGAZZINO]: [ NOME: "+nome+", QUANTITA': " + quantità +" ] COMPRATO");
    }
    public void vendi(){
        System.out.println("[MAGAZZINO]: [ NOME: "+nome+", QUANTITA': " + quantità +" ] VENDUTO");
    }
}

Step 3: Creiamo le classi concrete che estendono l’interfaccia

Compra.java

public class Compra implements Ordine {
    private Magazzino magazzino;

    public Compra(Magazzino magazzino){
        this.magazzino = magazzino;
    }

    public void esegui() {
        magazzino.compra();
    }
}

Vendi.java

public class Vendi implements Ordine {
    private Magazzino magazzino;

    public Vendi(Magazzino magazzino){
        this.magazzino = magazzino;
    }

    public void esegui() {
        magazzino.vendi();
    }
}

Step 4: Creiamo la classe Command

import java.util.ArrayList;
import java.util.List;

public class Command {
    private List ordineList = new ArrayList();

    public void prendiOrdine(Ordine order){
        System.out.println("[COMMAND]: prendiOrdine()::start");
        ordineList.add(order);
        System.out.println("[COMMAND]: prendiOrdine()::Ordine aggiunto alla lista!");
        System.out.println("[COMMAND]: prendiOrdine()::end");
    }

    public void piazzaOrdine(){
        System.out.println("[COMMAND]: piazzaOrdine()::start");
        for (Ordine ordine : ordineList) {
            ordine.esegui();
        }
        System.out.println("[COMMAND]: piazzaOrdine()::Ordini eseguiti!");
        ordineList.clear();
        System.out.println("[COMMAND]: piazzaOrdine()::end");
    }
}

Step 5: Creiamo il main

public class Main {
    public static void main(String[] args) {
        Magazzino magazzino = new Magazzino();

        Compra compraOrdine = new Compra(magazzino);
        Vendi vendiOrdine = new Vendi(magazzino);

        Command broker = new Command();
        broker.prendiOrdine(compraOrdine);
        broker.prendiOrdine(vendiOrdine);

        broker.piazzaOrdine();
    }
}

Step 6: Output

[COMMAND]: prendiOrdine()::start
[COMMAND]: prendiOrdine()::Ordine aggiunto alla lista!
[COMMAND]: prendiOrdine()::end
[COMMAND]: prendiOrdine()::start
[COMMAND]: prendiOrdine()::Ordine aggiunto alla lista!
[COMMAND]: prendiOrdine()::end
[COMMAND]: piazzaOrdine()::start
[MAGAZZINO]: [ NOME: Prodotto_1, QUANTITA': 25 ] COMPRATO
[MAGAZZINO]: [ NOME: Prodotto_1, QUANTITA': 25 ] VENDUTO
[COMMAND]: piazzaOrdine()::Ordini eseguiti!
[COMMAND]: piazzaOrdine()::end

 

LINK UTILI