informaticaPC

Patrones de Diseño Software


Regístrate

Tus datos no serán compartidos, solo nosotros te enviaremos información y novedades

Command

Este patrón resulta útil en escenarios en los que se han de enviar peticiones a otros objetos sin saber qué operación se ha de realizar, y ni tan siquiera quién es el receptor de dicha petición.

Dicho de otro modo: tenemos varios objetos que realizan acciones similares de forma diferente, y queremos que se procese la adecuada dependiendo del objeto solicitado.

El Invocador no sabe quién es el Receptor ni la acción que se realizará, tan sólo invoca un Comando que ejecuta la acción adecuada:

Command en UML

A continuación mostramos un ejemplo muy básico de uso este patrón, en el que creamos un menú de opciones.

Main.java (Cliente en el diagrama anterior):

package Command;

public class Main
{
    public static void main(String[] args)
    {
        // Crear el objeto Menú (el Invocador)
        Menu objMenu = new Menu();

        // Crear el Receptor
        Receptor objReceptor = new Receptor();

        // Crear las opciones de menú, indicándoles el Receptor
        IMenuItem objOpcionAbrir = new MenuItemAbrir( objReceptor );
        IMenuItem objOpcionImprimir = new MenuItemImprimir( objReceptor );
        IMenuItem objOpcionSalir = new MenuItemSalir( objReceptor );

        // Agregar las opciones al Menú
        objMenu.add( objOpcionAbrir );
        objMenu.add( objOpcionImprimir );
        objMenu.add( objOpcionSalir );

        // Ejecutar cada opción del menú
        objMenu.get(0).ejecutar();
        objMenu.get(1).ejecutar();
        objMenu.get(2).ejecutar();
    }
}

Receptor.java:

package Command;

public class Receptor
{
    public Receptor() {
    }

    // -----------------------

    public void accion( String accion )
    {
        if( accion.compareTo("ABRIR") == 0 ) {
            System.out.println("Abrir documento");
        } else if( accion.compareTo("IMPRIMIR") == 0 ) {
            System.out.println("Imprimir documento");
        } else if( accion.compareTo("SALIR") == 0 ) {
            System.out.println("Salir del programa");
        } else {
            System.out.println("Opción no válida");
        }
    }
}

Menu.java (Invocador en el diagrama anterior):

package Command;

import java.util.ArrayList;

public class Menu
{
    private ArrayList<IMenuItem> aMenu = new ArrayList<IMenuItem>();

    // --------------------------

    public Menu() {
    }

    // --------------------------

    public void add( IMenuItem objMenuItem )
    {
        this.aMenu.add( objMenuItem );
    }

    // --------------------------

    public IMenuItem get( int nOpcion )
    {
        return this.aMenu.get( nOpcion );
    }
}

IMenuItem.java (Command en el diagrama anterior):

package Command;

public interface IMenuItem {
    public void ejecutar();
}

MenuItemAbrir.java (un ConcreteCommand):

package Command;

public class MenuItemAbrir implements IMenuItem
{
    Receptor r;

    // --------------------------

    public MenuItemAbrir( Receptor r ) {
        this.r = r;
    }

    // --------------------------

    @Override
    public void ejecutar() {
        r.accion("ABRIR");
    }
}

MenuItemImprimir.java (un ConcreteCommand):

package Command;

public class MenuItemImprimir implements IMenuItem
{
    Receptor r;

    // --------------------------

    public MenuItemImprimir( Receptor r ) {
        this.r = r;
    }

    // --------------------------

    @Override
    public void ejecutar() {
        r.accion("IMPRIMIR");
    }
}

MenuItemSalir.java (un ConcreteCommand):

package Command;

public class MenuItemSalir implements IMenuItem
{
    Receptor r;

    // --------------------------

    public MenuItemSalir( Receptor r ) {
        this.r = r;
    }

    // --------------------------

    @Override
    public void ejecutar() {
        r.accion("SALIR");
    }
}

Al ejecutarlo obtendríamos como resultado:

Ejemplo de Command

EXPLICACIÓN:

  • Al inicio del programa creamos una instancia de la clase Menu (Invocador en el diagrama) junto con otra de Receptor, y después tres elementos de menú (que implementan IMenuItem) a los cuales pasamos la referencia del Receptor.
  • A continuación agregamos las opciones al Menu (en el cual quedarán registradas para su posterior acceso).
  • Finalmente ejecutamos cada una de las opciones del menú.
Primera página Anterior Siguiente Última página
Usamos cookies para ofrecerte una experiencia mejorada, el continuar navegando supone que aceptas su uso