**介绍:**将“请求”封装成对象,以便于使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
**主要解决:**在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
**何时使用:**在某些场合,比如要对行为进行”记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将”行为请求者”与”行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
**如何解决:**通过调用者调用接受者执行命令,顺序:调用者→命令→接受者。
**关键代码:**定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
**应用实例:**struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
**缺点:**使用命令模式可能会导致某些系统有过多的具体命令类。
**使用场景:**认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
**注意事项:**系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
实现
public class CommandPattenTest {
public static void main(String[] args) {
SimpleRemoteControl remoteControl = new SimpleRemoteControl();
remoteControl.setCommand(new LightOnCommand(new Light()));
remoteControl.buttonWasPressed();
remoteControl.setCommand(new LightOffCommand(new Light()));
remoteControl.buttonWasPressed();
remoteControl.setCommand(new DoorOpenCommand(new Door()));
remoteControl.buttonWasPressed();
remoteControl.setCommand(new DoorCloseCommand(new Door()));
remoteControl.buttonWasPressed();
}
static class SimpleRemoteControl{
Command slot;
public SimpleRemoteControl() { }
public void setCommand(Command slot) {
this.slot = slot;
}
public void buttonWasPressed() {
slot.execute();
}
}
interface Command {
void execute();
}
static class LightOnCommand implements Command {
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.on();
}
}
static class LightOffCommand implements Command {
Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.off();
}
}
static class Light {
void on(){
System.out.println("light on");
}
void off(){
System.out.println("light off");
}
}
static class DoorOpenCommand implements Command {
Door door;
public DoorOpenCommand(Door door) {
this.door = door;
}
@Override
public void execute() {
door.open();
}
}
static class DoorCloseCommand implements Command {
Door door;
public DoorCloseCommand(Door door) {
this.door = door;
}
@Override
public void execute() {
door.close();
}
}
static class Door {
void open(){
System.out.println("Door is open");
}
void close(){
System.out.println("DoorOpen is close");
}
}
}
标签:door,light,void,模式,命令,Command,new,public
From: https://blog.51cto.com/u_11906056/6985084