一.定义
将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求队列或者记录请求日志,以及支持可撤销的操作。
二.角色
1.Receiver(接收者角色),负责执行具体的请求。
2.Command(命令角色),申明需要执行的所有命令。
3.ConcreteCommand(具体命令角色),命令角色的具体实现,通常会持有接收者,并调用接收者来处理命令。
4.Invoker(调用者角色),接收到命令,并执行命令。
三.优缺点
优点
实现解偶,调用者和接收者分离,不存在依赖。
容易扩展
缺点
随着命令越多,类就要不断的增加。
四.使用说明
我们以遥控器控制电视为例子说明:
1.命令角色-定义一个命令角色接口
/**
* 命令模式-命令角色,
*/
public interface ICommand {
void execute();//执行命令的方法
}
2.命令接收者角色-这里的命令接收者就是电视:
/**
* 命令模式-命令接收者:电视
*/
public class TvReceiver {
public void receiver(){
System.out.print("接收到命令");
}
}
3.具体的命令角色:
/**
* 命令模式-具体命令角色
*/
public class ChangeCommand implements ICommand{
protected TvReceiver mTvReceiver;
public ChangeCommand(TvReceiver tvReceiver){
this.mTvReceiver = tvReceiver;
}
@Override
public void execute() {
System.out.print("这里具体的命令就是-更换频道");
mTvReceiver.receiver();//调用接收者
}
}
4.调用者角色:
public class Invoker {
private ICommand mIcommand;
public Invoker(ICommand iCommand){
this.mIcommand = iCommand;
}
public void action(){
mIcommand.execute();
}
}
四.在android中的使用:
在Android中 Handler就使用了命令模式,
Message:我们知道Handler在Android中使用来处理消息(Message)所以这里Message就是命令模式中的命令角色;
Lopper:还有一个Looper负责从消息队列中不断轮询然后取出消息,所以Looper就是命令模式中的调用者角色。
Handler:Handler就负责执行消息的发送和处理操作就是接收者角色。