定义:
命令模式属于对象的行为模式,又叫行动模式、交易模式。
命令模式把一个请求或者操作封装到一个对象中,命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
角色:
客户端(Client)角色:创建一个具体命令对象(ConcreteCommand),并确定接收者。
命令(Command)角色:声明一个给所有具体命令对象的接口。
具体命令(ConcreteCommand)角色:定义一个接收者与行为之间的弱耦合,调用接收者的执行方法。
请求者(Invoker)角色:负责调用命令对象执行相应的请求。
接收者(Receiver)角色:负责具体执行相应的操作。
例子:
养牛场都有挤奶器(MilkMachine),工人(Worker)通过操作面板(KeyBoard)来执行挤奶的工作,加入有两个简单操作,开始(PlayCommand) 停止(StopCommand),则整个链条就完整了。工人(Worker)是客户端角色,工人通过面板(KeyBoard)负责创建具体的命令对象,此时面板便是请求者角色,具体的命令对象就是开始、停止按钮,最后的接收者是挤奶器(MilkMachine)扮演接收者角色。
类图:
代码如下:
/**
* 请求者角色
* 键盘类对象
* @author wang
*/
public class KeyBoard {
//持有命令对象
private Command playCommand;
private Command stopCommand;
public void setPlayCommand(Command playCommand){
this.playCommand = playCommand;
}
public void setStopCommand(Command stopCommand){
this.stopCommand = stopCommand;
}
//执行启动命令
public void play(){
playCommand.execute();
}
//执行停止命令
public void stop(){
stopCommand.execute();
}
}
/**
* 命令角色
* @author wang
*/
public interface Command {
/**
* 执行方法
*/
public void execute();
}
/**
* 具体命令角色类
* 开始命令
* @author wang
*/
public class PlayCommand implements Command {
//持有接收者对象
private MilkMachine milkMachine = null;
//构造方法
public PlayCommand(MilkMachine milkMachine){
this.milkMachine = milkMachine;
}
public void execute() {
// TODO Auto-generated method stub
//调用接收者对象,执行操作
milkMachine.play();
}
}
/**
* 具体命令角色类
* 停止命令
* @author wang
*/
public class StopCommand implements Command {
//持有接收者对象
private MilkMachine milkMachine = null;
//构造方法
public StopCommand(MilkMachine milkMachine){
this.milkMachine = milkMachine;
}
public void execute() {
// TODO Auto-generated method stub
//调用接收者对象,执行操作
milkMachine.stop();
}
}
/**
* 接收者角色
* 挤奶器类
* 负责执行操作
* @author wang
*/
public class MilkMachine {
public void play(){
System.out.println("开始挤奶");
}
public void stop(){
System.out.println("停止挤奶");
}
}
/**
* 客户端角色
* 挤奶工人类
* @author wang
*/
public class Worker {
public static void main(String args[]){
//创建接收者对象
MilkMachine milkMachine = new MilkMachine();
//创建命令对象
Command playCommand = new PlayCommand(milkMachine);
Command stopCommand = new StopCommand(milkMachine);
//创建请求者对象
KeyBoard keyBoard = new KeyBoard();
keyBoard.setPlayCommand(playCommand);
keyBoard.setStopCommand(stopCommand);
//测试
keyBoard.play();
keyBoard.stop();
}
}
运行结果:
优点:
将请求的发起端与请求的执行端彻底的解耦。