命令模式
/**
* 命令模式
* 将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;
* 将请求排队或记录请求日志;
* 以及支持可撤销的操作
*
* 作用:
* 1.较容易设计一个命令队列
* 2.在需要的情况下,容易实现将命令写入日志
* 3.允许接收方是否绝决定接收请求
* 4.容易实现对命令的撤销和修改
* 5.添加新的命令参数时不影响其他命令类,容易扩展
* 6.实现将命令的请求对象和执行对象分割开
*/
结构图

范例
public class BBQer {
public void bakeMutton(){
Log.d("meee", "烤羊肉");
}
public void bakeChicken(){
Log.d("meee", "拷鸡肉");
}
}
public abstract class Command {
protected BBQer mBBQer;
public Command(BBQer BBQer) {
mBBQer = BBQer;
}
abstract public void execCommand();
}
public class Waiter {
private List<Command> mCommands=new ArrayList<>();
public void setOrder(Command command){
mCommands.add(command);
}
public void notifyCommand(){
for (Command command:mCommands){
command.execCommand();
}
}
}
public class BakeMuttonCommand extends Command {
public BakeMuttonCommand(BBQer BBQer) {
super(BBQer);
}
@Override
public void execCommand() {
mBBQer.bakeMutton();
}
}
public class BakeChickenCommand extends Command{
public BakeChickenCommand(BBQer BBQer) {
super(BBQer);
}
@Override
public void execCommand() {
mBBQer.bakeChicken();
}
}
BBQer bbQer=new BBQer();
Command bakeMutton=new BakeMuttonCommand(bbQer);
Command bakeChicken=new BakeChickenCommand(bbQer);
Waiter waiter = new Waiter();
waiter.setOrder(bakeMutton);
waiter.setOrder(bakeMutton);
waiter.setOrder(bakeChicken);
waiter.setOrder(bakeMutton);
waiter.notifyCommand();