命令模式定义:
将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。所以命令模式也被称为动作action模式或者事物transaction模式。
命令模式的优点:
1.降低了行为发送者和行为执行者之间紧耦合的关系。
2.新的命令容易添加到代码里去。
命令模式的缺点:
1.会使类的数量增加。
命令模式的角色:
1.抽象命令类:它可能是一个抽象类或者接口,它抽象出关于命令的业务方法。
2. 具体命令类:它实现了抽象命令的方法,具体化抽象命令类的而业务方法。
3.请求发送者:它通过命令对象来执行请求,它不需要在设计时就知道请求的接收者,它只要与抽象类存在关联,在程序的运行过程中,它通过调用命令角色的方法,(命令类又与请求的接收者存在关联)间接调用了请求的接收者的相关动作。
4.请求接收者:接收者执行与请求相关的操作,实现对请求业务的处理。
下面我以于谦发一个叫郭德纲自我介绍的命令为例,来介绍命令模式:
/**
*抽象命令角色
* Created by Administrator
*/
public abstract class Command {
Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void Execute();
}
/**
*具体命令角色
* Created by Administrator
*/
public class ConcreteCommand extends Command {
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void Execute() {
//具体命令角色含有命令接收者的引用,调用命令接收者的执行命令的业务方法
receiver.action();
}
}
/**
*命令请求者(下达命令着)
* Created by Administrator
*/
public class Invoker {
//命令请求者含有命令类的相关引用
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void ExecuteCommand(){
//命令请求者通过调用命令类的相关的业务方法,间接调用命令接收者执行命令的业务方法
command.Execute();
}
}
/** *命令接收者 * Created by Administrator */ public class Receiver { public void action(){ Log.d("Command", "观众朋友们,大家好,床前明月光,疑是地上霜.举头望明月,我叫郭德纲"); } }
客户端调用:
Receiver receiver=new Receiver();
Command command=new ConcreteCommand(receiver);
Log.d("Command","观众朋友们,大家好,我叫于谦,我身旁的这位给大家介绍下自己吧");
Invoker invoker=new Invoker(command);
invoker.ExecuteCommand();
结果: