1、概念:
将来自客户端的请求传入一个对象,从而可用不同的请求对客户进行参数化,用于“行为请求者”和“行为实现者”进行解耦,实现二者之间的松耦合,以便适应变化, 分离变化与不变的因素。
在面向对象程序设计中,一个对象调用另一个对象,一般的调用过程是:创建目标对象实例,设置调用参数;调用目标对象的方法。有时需专门设置一个类对调用过程进行封装,此类成为Command类。
2、应用场景。
整个调用过程比较复杂,或存在多处这种调用,此时,使用Command对该调用加以封装,便于功能的再利用。
调用前后需要对调用参数进行某些处理。
调用前后需要进行某些额外处理。如日志、缓存、记录历史操作等。
3.UML
4、具体应用场景
1、使用命令模式作为“CallBack”在面向对象系统中的替代,“CallBack”是先将一个函数登记上,然后在以后调用此函数。
2、需要在不同的时间指定请求,将请求排队,一个命令对象和原先的请求发出者可能有不同的生命周期,换言之,原先请求发出者可能不存在了,而命令对象本身是活动的,这时的命令接受者可以在本地,也可在网络的一个地址,命令对象可以在串行化之后传送到另一台机器上去。
3、系统需要支持命令的撤销,命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo方法,把命令产生的效果撤销掉,命令对象还可提供redo()方法,以供客户端在需要时再重新实施命令效果。
4、如果一个系统要将系统中所有数据更新到日志中,以便在系统崩溃时,可根据日志里读回所有的数据,更新命令,重新调用Execute方法,一条条执行这些命令,从而恢复系统在崩溃前做的系统更新。
public class Barbecuer {
public void bakeMutton(){
System.out.println("烤羊肉串");
}
public void bakeChickenWing(){
System.out.println("烤鸡翅");
}
}
public abstract class Command{
protected Barbecuer barbecuer;
public Command(Barbecuer barbecuer){
this.barbecuer = barbecuer;
}
public abstract void executeCommand();
}
public class BakeChickenWingCommand extends Command{
public BakeChickenWingCommand(Barbecuer barbecuer) {
super(barbecuer);
}
@Override
public void executeCommand() {
barbecuer.bakeChickenWing();
}
public String toString(){
return "命令模式BakeChickenWingCommand";
}
}
public class BakeMuttonCommand extends Command{
public BakeMuttonCommand(Barbecuer barbecuer) {
super(barbecuer);
}
@Override
public void executeCommand() {
barbecuer.bakeMutton();
}
public String toString(){
return "命令模式BakeMuttonCommand";
}
}
public class Waiter {
private List<Command> orders = new ArrayList<Command>();
public void setOrder(Command command){
if (command.toString().equals("命令模式BakeChickenWingCommand")) {
System.out.println("服务员:鸡翅没啦,清点别的");
}else {
orders.add(command);
System.out.println("增加订单 "+command.toString());
}
}
public void cancelOrder(Command command){
orders.remove(command);
System.out.println("取消订单 "+command.toString());
}
public void notifyCommand(){
for (Command command:orders) {
command.executeCommand();
}
}
}
public class TestCommand {
public static void main(String[] args) {
Barbecuer barbecuer = new Barbecuer();
Command com1 = new BakeChickenWingCommand(barbecuer);
Command com2 = new BakeMuttonCommand(barbecuer);
Command com3 = new BakeMuttonCommand(barbecuer);
Waiter waiter = new Waiter();
waiter.setOrder(com1);
waiter.setOrder(com2);
waiter.setOrder(com3);
waiter.notifyCommand();
}
}