转载请注明出处 http://blog.csdn.net/qq_31715429/article/details/78501040
本文出自:猴菇先生的博客
1.定义:
将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
2.使用场景:
需要抽象出待执行的动作,然后以参数的形式提供出来。
在不同的时刻指定、排列和执行请求。一个命令对象可以有与初始化请求无关的生存期。
需要支持取消操作。
支持修改日志功能,这样当系统崩溃时,这些修改可以被重做一遍。
需要支持实务操作。
3.例子:
/**
* 接受者类
*/
public class Receiver{
/**
* 真正执行具体命令逻辑的方法
*/
public void action(){
System.out.println("执行具体操作");
}
}
public interface Command{
/**
* 执行具体操作的命令
*/
void execute();
}
/**
* 具体命令类
*/
public class ConcreteCommand implements Command{
private Receiver mReceiver;//只有一个对接受者对象的引用
public ConcreteCommand(Receiver receiver){
mReceiver = receiver;
}
@Override
public void execute(){
// 调用接受者的相关方法来执行具体逻辑
mReceiver.action();
}
}
/**
* 请求者类
*/
public class Invoker{
private Command mCommand;//持有一个对相应命令对象的引用
public Invoker(Command command){
mCommand = command;
}
public void action(){
mCommand.execute();//调用具体命令对象的相关方法,执行具体命令
}
}
public class Test{
public static void main(String[] args){
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.action();
}
}
将行为调用者与实现者解耦。
接受者负责具体实施或执行一个请求,命令类在接受者和命令执行的具体行为之间加以弱耦合,请求者调用命令对象执行具体的请求。
在请求者里使用一个数据结构来存储执行过的命令对象,以此可以方便地知道执行过哪些命令动作,并可以在需要时恢复。
4.总结:
缺点是大量衍生类的创建,但是具有更弱的耦合性、更灵活的控制性以及更好的扩展性。