java设计模式——命令模式

定义:命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

设计模式 —— 命令模式(Command Pattern)


图:百度百科                                                            

Client(客户):负责创建一个具体的命令(Concrete Command),并设置其接收者

Invoker(调用者):调用者持有一个命令对象,并在某个时刻调用命令对象的 execute() 方法。

Command(命令接口):包含命令对象的 execute() 方法和 undo() 方法。

ConcreteCommand(具体命令):实现命令接口。包括两个操作,执行命令和撤销命令。

Receiver(接收者):接受命令并执行。


例子

通过遥控器打开电灯

Light

public class Light {
    public void on() {
        System.out.println("light on");
    }

    public void off() {
        System.out.println("light off");
	}
}

Command

public interface Command {
	void execute();
}

LightOnCommand

public class LightOnCommand implements Command {
	Light light;
	
	public LightOnCommand(Light light) {
		this.light = light;
	}
	
	public void execute() {
		light.on();
	}
}

SimpleRemoteControl

public class SimpleRemoteControl {
	Command slot;

	public void setCommand(Command slot) {
		this.slot = slot;
	}
	
	public void buttonWasPressed() {
		slot.execute();
	}
}

RemoteControllerTest

public class RemoteControllerTest {
	public static void main(String[] args) {
		SimpleRemoteControl remote = new SimpleRemoteControl();
		Light light = new Light();
		LightOnCommand lightOn = new LightOnCommand(light);
		
		remote.setCommand(lightOn);
		remote.buttonWasPressed();
	}
}


撤销

可通过简单地记录最后一个被执行的命令,或使用一个堆栈记录操作过程的每一个命令。

宏命令

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();
		}
	}
}

空对象(null object)

一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以

在数据不可用的时候提供默认的行为。

例如:遥控器不可能一出厂就设置了有意义的命令对象,所以提供了NoCommand对象作为代用品,当调用它的execute()方法时,这种对象是什么事情都不做.

public class NoCommand implements Command {

	public void execute() {	}
}

在许多设计模式中,都会看到空对象的使用。甚至有些时候,空对象本身也被视为是一种设计模式。


参考:

《Head first 设计模式》

设计模式 —— 命令模式(Command Pattern)

猜你喜欢

转载自blog.csdn.net/qq_34902684/article/details/79931401
今日推荐