一、概念
命令模式:将"请求"封装成对象,以便使用不同的请求、列队、日志来参数化其他对象。命令模式也支持可撤销的操作。
关系图:
二、应用实例
1. 家电自动化---遥控器
关系图:
实现代码:
Command接口
/**
* 命令接口,所有命令都实现该接口
* Created by hanxin on 2017/11/13.
*/
public interface Command {
//用于执行命令
void execute();
//用于撤销命令
void nudo();
}
Light类
/**
* Created by hanxin on 2017/11/13.
*/
public class Light {
public void on(){
System.out.println("light is on");
}
public void off(){
System.out.println("light is off");
}
}
LightOnCommand命令类
/**
* 开灯命令
* Created by hanxin on 2017/11/13.
*/
public class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light){
this.light = light;
}
/*
开灯
*/
@Override
public void execute() {
light.on();
}
/*
关灯,用于撤销键,与execute()相反
*/
@Override
public void nudo() {
light.off();
}
}
LightOffCommand命令类
/**
* 关灯命令
* Created by hanxin on 2017/11/13.
*/
public class LightOffCommand implements Command {
private Light light;
public LightOffCommand(Light light){
this.light = light;
}
/*
关灯
*/
@Override
public void execute() {
light.off();
}
/*
开灯
*/
@Override
public void nudo() {
light.on();
}
}
RemoteControl类
/**
* 遥控器
* Created by hanxin on 2017/11/13.
*/
public class RemoteControl {
private Command[] onCommands;
private Command[] offCommands;
//存储撤销命令
private Command backCommand;
public RemoteControl(){
this.onCommands = new Command[7];
this.offCommands = new Command[7];
Command command = new UnCommand();
for(int i=0;i<7;i++){
this.onCommands[i] = command;
this.offCommands[i] = command;
}
}
/*
设置命令
*/
public void setCommand(int soft,Command commandOn,Command commandOff){
this.onCommands[soft] = commandOn;
this.offCommands[soft] = commandOff;
}
public void onButtonWasPushed(int soft){
this.onCommands[soft].execute();
this.backCommand = this.onCommands[soft];
}
public void offButtonWasPushed(int soft){
this.offCommands[soft].execute();
this.backCommand = this.offCommands[soft];
}
public void backCommand(){
backCommand.nudo();
}
}
测试
/**
* Created by hanxin on 2017/11/13.
*/
public class Test {
public static void main(String[] args) {
RemoteControl control = new RemoteControl();
Light light = new Light();
LightOnCommand onCommand = new LightOnCommand(light);
LightOffCommand offCommand = new LightOffCommand(light);
control.setCommand(0,onCommand,offCommand);
control.onButtonWasPushed(0);
control.backCommand();
control.offButtonWasPushed(0);
control.backCommand();
}
}
2.宏命令
/**
* 将一组命令组合在一起使用
* Created by 韩信 on 2017-11-14.
*/
public class MacroCommand implements Command{
/*
命令数组
*/
private Command[] commands;
public MacroCommand(Command[] commands){
this.commands = commands;
}
/*
执行命令,一次执行多个命令
*/
@Override
public void execute() {
for(int i=0;i<commands.length;i++){
commands[i].execute();
}
}
/*
撤销命令
*/
@Override
public void nudo() {
for(int i=0;i<commands.length;i++){
commands[i].nudo();
}
}
}
三、优缺点
优点:
- 降低对象之间的耦合度。
- 新的命令可以很容易地加入到系统中。
- 可以比较容易地设计一个组合命令。
- 调用同一方法实现不同的功能
缺点
- 使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。