Patrones de diseño (6) - Modo Comando

El modo de comando (Command), la "petición" encapsulado en objetos, para usar diferentes colas de solicitud u otros objetos es log parametrizada. El modo de comando también se apoya operaciones se pueden deshacer.

Directamente ser ilustrado con un ejemplo: El código simula un control remoto hogar inteligente, el control remoto tiene un ranuras siete programables (cada ranura corresponde a un aparato electrodoméstico diferente), cada ranura tiene un par de correspondiente al botón de encendido / apagado, el control remoto y un botón conjunto de deshacer. mando a distancia debe saber cómo interpretar que se pulsa el botón de operación, y luego emitir una solicitud a los aparatos electrodomésticos correctas, pero el control remoto no necesitan saber los detalles de los aparatos de automatización, o cómo convertir el calentador de agua.

El modo de comando "de operación solicitante" desacoplamiento de "hacedor de la acción" objeto, empleado en el diseño de "objetos de comando" , la petición (por ejemplo, encender las luces) encapsulado en un objeto particular (por ejemplo, una lámpara de sala de estar objetos). Si un objeto de comando se almacena para cada botón, a continuación, cuando se pulsa el botón, se puede pedir al objeto de comando para hacer el trabajo relacionado. El control remoto no necesita saber lo que el contenido del trabajo, siempre y cuando no es un comando y los objetos de objetos correctos pueden comunicarse, hacer las cosas en él, de esta manera, el mando a distancia (es decir, expedida el objeto solicitado, invocador) y diversos aparatos objetos (es decir, la aceptación y la aplicación de estos objeto solicitado, receptor) en el desacoplado.

La imagen muestra el modo de comando de la clase

La siguiente mirada directa en el código

Interfaz de comandos

public interface Command {
	public void execute();
	public void undo();
}

Encender las luces con el fin de lograr una

import com.crow.Receiver.Light;

public class LightOnCommand implements Command {
	Light light;

	public LightOnCommand(Light light) {
		this.light = light;
	}

	public void execute() {
		light.on();
	}

	public void undo() {
		light.off();
	}
}

categorías de la lámpara:

public class Light {
	String location;
	int level;

	public Light(String location) {
		this.location = location;
	}

	public void on() {
		level = 100;
		System.out.println("Light is on");
	}

	public void off() {
		level = 0;
		System.out.println("Light is off");
	}

	public void dim(int level) {
		this.level = level;
		if (level == 0) {
			off();
		}
		else {
			System.out.println("Light is dimmed to " + level + "%");
		}
	}

	public int getLevel() {
		return level;
	}
}

Comando solicitante: un mando a distancia, una llave que también implementa el botón Deshacer Deshacer

import com.crow.Command.Command;
import com.crow.Command.NoCommand;

//
// This is the invoker
//
public class RemoteControl {
	Command[] onCommands;
	Command[] offCommands;
	Command undoCommand;
 
	public RemoteControl() {
		onCommands = new Command[7];
		offCommands = new Command[7];
 
		Command noCommand = new NoCommand();
		for(int i=0;i<7;i++) {
			onCommands[i] = noCommand;
			offCommands[i] = noCommand;
		}
		undoCommand = noCommand;
	}
  
	public void setCommand(int slot, Command onCommand, Command offCommand) {
		onCommands[slot] = onCommand;
		offCommands[slot] = offCommand;
	}
 
	public void onButtonWasPushed(int slot) {
		onCommands[slot].execute();
		undoCommand = onCommands[slot];
	}
 
	public void offButtonWasPushed(int slot) {
		offCommands[slot].execute();
		undoCommand = offCommands[slot];
	}

	public void undoButtonWasPushed() {
		undoCommand.undo();
	}
 
	public String toString() {
		StringBuffer stringBuff = new StringBuffer();
		stringBuff.append("\n------ Remote Control -------\n");
		for (int i = 0; i < onCommands.length; i++) {
			stringBuff.append("[slot " + i + "] " + onCommands[i].getClass().getName()
				+ " " + offCommands[i].getClass().getName() + "\n");
		}
		stringBuff.append("[undo] " + undoCommand.getClass().getName() + "\n");
		return stringBuff.toString();
	}
}

Además, hay una clase de comandos macro, en el que la matriz de comandos para almacenar una gran cantidad de comandos puede ser retirada y una pluralidad de realización desechable de comandos.

public class MacroCommand implements Command {
	Command[] commands;
 
	public MacroCommand(Command[] commands) {
		this.commands = commands;
	}
 
	public void execute() {
		for (int i = 0; i < commands.length; i++) {
			commands[i].execute();
		}
	}
 
    /** * NOTE: these commands have to be done backwards to ensure proper undo functionality */
	public void undo() {
		for (int i = commands.length -1; i >= 0; i--) {
			commands[i].undo();
		}
	}
}

solicitud

  • Registros de solicitudes : cuando ejecutamos un comando, la historia se almacena en el disco, una vez que el sistema se bloquea, se puede volver a cargar los objetos de comando, y los lotes de estos objetos en las llamadas a su vez ejecutan método (), utilizando el registro, podemos todas las operaciones desde el último registro de punto, si el sistema está fuera de la situación, estas operaciones comenzó a recuperarse desde el puesto de control.
  • Transacción proceso (transacción)  usando un comando de macro, podemos a la vez o revocar un conjunto de acciones, de esta manera, todo un grupo de todas las operaciones debe ser completado, o no llevar a cabo ninguna operación, que aplica el principio de la transacción
Publicados 295 artículos originales · ganado elogios 37 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/tianshan2010/article/details/104706517
Recomendado
Clasificación