命令模式是一种数据驱动的设计模式,它属于行为型模式。
请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
命令模式使请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。
优点:
缺点:
开关电灯
接收者received
/**
* 电灯(接收者)
*/
public class LightReceiver {
public void on() {
System.out.println(" 电灯打开了.. ");
}
public void off() {
System.out.println(" 电灯关闭了.. ");
}
}
命令对象接口Command
/**
* 命令对象
*/
public interface Command {
//执行动作(操作)
void execute();
//撤销动作(操作)
void undo();
}
Command实现类
/**
* 开灯
*/
public class LightOnCommand implements Command {
LightReceiver light;
public LightOnCommand(LightReceiver light) {
super();
this.light = light;
}
@Override
public void execute() {
//调用接收者的方法
light.on();
}
@Override
public void undo() {
//调用接收者的方法
light.off();
}
}
/**
* 关灯
*/
public class LightOffCommand implements Command {
LightReceiver light;
public LightOffCommand(LightReceiver light) {
super();
this.light = light;
}
@Override
public void execute() {
// 调用接收者的方法
light.off();
}
@Override
public void undo() {
// 调用接收者的方法
light.on();
}
}
控制器Controller
/**
* Controller
*/
public class RemoteController {
// 开关按钮的命令数组
Command onCommands;
Command offCommands;
// 撤销的命令
Command undoCommand;
public void setCommand(Command onCommand, Command offCommand) {
onCommands = onCommand;
offCommands = offCommand;
}
public void onButtonWasPushed() {
// 开的按钮
onCommands.execute();
// 记录这次的操作,用于撤销
undoCommand = onCommands;
}
public void offButtonWasPushed() {
// 关的按钮
offCommands.execute();
// 记录这次的操作,用于撤销
undoCommand = offCommands;
}
// 撤销按钮
public void undoButtonWasPushed() {
undoCommand.undo();
}
}
Main
public class Main {
public static void main(String[] args) {
//创建电灯的对象(接受者)
LightReceiver lightReceiver = new LightReceiver();
//创建电灯相关的开关命令
LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);
LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);
//需要一个遥控器
RemoteController remoteController = new RemoteController();
//给我们的遥控器设置命令
remoteController.setCommand(lightOnCommand, lightOffCommand);
System.out.println("--------按下灯的开按钮-----------");
remoteController.onButtonWasPushed();
System.out.println("--------按下灯的关按钮-----------");
remoteController.offButtonWasPushed();
System.out.println("--------按下撤销按钮-----------");
remoteController.undoButtonWasPushed();
}
}
---------结果----------
--------按下灯的开按钮-----------
电灯打开了..
--------按下灯的关按钮-----------
电灯关闭了..
--------按下撤销按钮-----------
电灯打开了..