命令模式:(官方版定义)将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
(理解版)其实就是把一个或多个方法封装成对象调用。
(易懂型)洗衣服为例:洗衣服要1、放衣服+洗衣液洗,2、清洗,3最后脱水,如果你老婆叫你去洗衣服,她就只需要告诉你一声洗衣服,你就屁颠屁颠的去打开洗衣机洗衣服去了。她却不用关心你是洗的!-----老婆说的“洗衣服”--》”命令“,”你“--》命令对象,“洗衣机”---》接收者(具体洗衣服的是洗衣机,而不是你,也不是你老婆)老婆发送命令,你传递命令,洗衣机真正执行命令。
优点:将发送请求的对象和执行请求的对象解耦(通过命令对象)。
应用于:线程池,工作队列,日志请求,事务。。。
以遥控器为例。遥控器可以控制家里面的灯光,电视机,电饭煲等的开关。简单的以遥控灯光开关为例,先上代码:
1、首先我们要有一个灯光类:(洗衣机)
public class Light {
public void onLight() {
Log.d("TAG", "开启灯光");
}
public void offLight(){
Log.d("TAG", "关闭灯光");
}
}
2、有个命令对象基类(遵循多用组合,少用继承的原则使用了interface)
public interface Command {
/**
* 执行命令
*/
public void execute();
/**
* 撤销命令
*/
public void undo();
}
3、实现一个打开灯光命令的具体命令对象类(你)
public class LightOnCommand implements Command{
public Light mLight;
public LightOnCommand(Light light ) {
this.mLight = light;
}
@Override
public void execute() {
mLight.onLight();
}
@Override
public void undo() {
mLight.offLight();
}
}
4、最后是一个控制类:(老婆)
public class RemoteControl {
private Command mCommand;
public RemoteControl() {
}
public Command getmCommand() {
return mCommand;
}
public void setmCommand(Command mCommand) {
this.mCommand = mCommand;
}
public void onPressLightOn(){
if (mCommand != null){
mCommand.execute();
}
}
public void undo(){
if (mCommand != null) {
mCommand.undo();
}
}
}
//遥控器(老婆)
RemoteControl control = new RemoteControl();
//灯(洗衣机)
Light light = new Light();
//打开灯光的事情不是你去做!是有灯自己去打开,所以你要有一个灯。(洗衣服不是你自己去洗,是交给洗衣机去洗,所以要你要有一个洗衣机)
LightOnCommand lightOnCommand = new LightOnCommand(light);
//打开灯光就要有打开灯管的命令对象才行(老婆要有你才能使唤呀!不然她使唤谁去)
control.setmCommand(lightOnCommand);
//打开灯光(老婆叫你去洗衣服)(control代表遥控器or老婆)
control.onPressLightOn();
上面几行代码解释你可以从下面往上看。
简单的暂时写到这里,看完代码,再回过头去看看概念,会发现又懂一点了。
文章会随着以后自己的理解慢慢修改。如果文章有理解错误希望能纠正,谢谢。。。。
学习自《Head First 设计模式》------命令模式(Command Pattern)