一句话定义:
将一系列操作请求封装成一个命令对象,用户使用不同请求操作,支持记录、撤销等操作。
使用场景:
1.需要对行为进行记录、撤销或重做、事务等处理时
2.行为请求者与行为实现者通常是一种紧耦合的关系需要解耦时
实现要点:
1.定义三个角色:received:真正的命令执行对象;Command:命令;invoker 使用命令对象的入口
2.通过命令调用类调用接收者接收命令。调用者→接受者→命令
3.降低耦合度,新命令很容易扩展进去
情景假设:
开启、关闭 两个操作。
进行封装,并记录操作,使用命令模式。
实现步骤:
1. 创建请求类,完成具体的操作
/**
* Created by ffengz.
*
* 具体的操作行为 请求类
*/
public class Operator {
/**
* 开启操作
*/
public void turnOn(){
Log.i("info", "trunOn: ==++ 开启" );
}
/**
* 关闭操作
*/
public void turnOff(){
Log.i("info", "turnOff: ==++ 关闭");
}
}
2. 创建命令接口类
/**
* Created by ffengz.
*
* 命令接口
*/
public interface Command {
/**
* 命令执行
*/
void execute();
}
3. 创建命令实体类,实现命令接口
/**
* Created by ffengz.
*
* 命令实体类 开启动作
*/
public class TurnOnCommand implements Command {
private Operator mInvoker;
public TurnOnCommand(Operator invoker) {
this.mInvoker = invoker;
}
@Override
public void execute() {
mInvoker.turnOn();
}
}
/**
* Created by ffengz.
*
* 命令实体类 关闭动作
*/
public class TurnOffCommand implements Command {
private Operator mInvoker;
public TurnOffCommand(Operator invoker) {
this.mInvoker = invoker;
}
@Override
public void execute() {
mInvoker.turnOff();
}
}
4. 封装命令调用者,提供调用入口,简单封装
/**
* Created by ffengz.
*
* 命令调用者 封装命令 简单封装
*/
public class Invoker {
private TurnOffCommand mTurnOff;
private TurnOnCommand mTurnON;
/**
* 设置开启命令
* @param command 开启命令
*/
public void setTurnOnCommand(TurnOnCommand command){
this.mTurnON = command;
}
/**
* 设置关闭命令
* @param command 关闭命令
*/
public void setTurnOffCommand(TurnOffCommand command){
this.mTurnOff = command;
}
/**
* 执行开启命令
*/
public void turnOn(){
mTurnON.execute();
}
public void turnOff(){
mTurnOff.execute();
}
}
5. 封装命令调用者,提供调用入口,记录操作序列
/**
* Created by ffengz.
*
* 命令调用者 封装命令 记录操作序列
*/
public class Invoker2 {
private List<Command> commandList = Collections.synchronizedList(new ArrayList<Command>());
/**
* 添加新命令
* @param command 新命令
*/
public void add(Command command){
commandList.add(command);
}
/**
* 执行命令
*/
public void execute(){
if (commandList.size() > 0){
for (Command c :
commandList) {
c.execute();
}
}
}
/**
* 记录
*/
public void record(){
if (commandList.size() > 0){
for (Command c :
commandList) {
if (c instanceof TurnOnCommand){
Log.i("info", "record: ==++ 开启动作" );
}else if (c instanceof TurnOffCommand){
Log.i("info", "record: ==++ 关闭动作");
}
}
}
}
}
6. 调用命令
Operator operator = new Operator();
TurnOnCommand turnOnCommand = new TurnOnCommand(operator);
TurnOffCommand turnOffCommand = new TurnOffCommand(operator);
Invoker invoker = new Invoker();
invoker.setTurnOnCommand(turnOnCommand);
invoker.setTurnOffCommand(turnOffCommand);
invoker.turnOn();
invoker.turnOff();
Invoker2 invoker2 = new Invoker2();
invoker2.add(turnOnCommand);
invoker2.add(turnOnCommand);
invoker2.add(turnOffCommand);
invoker2.execute();
invoker2.record();