一、概念
命令模式将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
二、类图及基本代码
//抽象命令
public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver){
this.receiver=receiver;
}
abstract public void Execute();
}
//具体命令
public class ConcreteCommand extends Command{
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void Execute() {
receiver.Action();
}
}
//Invoker负责记录命令,并执行命令
public class Invoker {
private Command command;
public void setCommand(Command command){
this.command=command;
}
public void ExecuteCommand(){
command.Execute();
}
}
//接收者
public class Receiver {
public void Action(){
System.out.println("执行请求");
}
}
//客户端
public class Client {
public static void main(String[] args) {
Receiver receiver=new Receiver();
Command command=new ConcreteCommand(receiver);
Invoker invoker=new Invoker();
invoker.setCommand(command);
invoker.ExecuteCommand();
}
}
三、实例之餐馆点餐
//抽象命令
public abstract class Command {
protected Barbecuer receiver;
public Command(Barbecuer barbecuer){
this.receiver=barbecuer;
}
abstract public void ExcuteCommand();
}
//烤羊肉串命令
public class BakeMuttonCommand extends Command{
public BakeMuttonCommand(Barbecuer barbecuer) {
super(barbecuer);
}
@Override
public void ExcuteCommand() {
receiver.BakeMutton();
}
}
//烤鸡翅膀命令
public class BakeChickenWingCommand extends Command{
public BakeChickenWingCommand(Barbecuer barbecuer) {
super(barbecuer);
}
@Override
public void ExcuteCommand() {
receiver.BakeChickenWing();
}
}
//烤肉串师傅---接收者
public class Barbecuer {
public void BakeMutton(){
System.out.println("烤羊肉串");
}
public void BakeChickenWing(){
System.out.println("烤鸡翅膀");
}
}
//服务员---调用者
public class Waiter {
private Command command;
public void SetOrder(Command command){
this.command=command;
}
public void Notify(){
command.ExcuteCommand();
}
/*
private List<Command> orders=new ArrayList<>();
public void SetOrder(Command command){
orders.add(command);
System.out.println("增加订单:"+command.toString());
}
public void CancelOrder(Command command){
orders.remove(command);
System.out.println("取消订单:"+command.toString());
}
public void Notify(){
for (Command command : orders) {
command.ExcuteCommand();
}
}*/
}
//客户端
public class Client {
public static void main(String[] args) {
Barbecuer barbecuer=new Barbecuer();
Command command1=new BakeChickenWingCommand(barbecuer);
Command command2=new BakeChickenWingCommand(barbecuer);
Waiter waiter=new Waiter();
System.out.println(command1.toString());
waiter.SetOrder(command1);
waiter.Notify();
waiter.SetOrder(command2);
waiter.Notify();
Command command3=new BakeMuttonCommand(barbecuer);
waiter.SetOrder(command3);
waiter.Notify();
}
}
四、总结
1、命令模式是对命令的封装,把发出命令的责任和执行命令的责任分隔开,委派给不同的对象。如实例中,服务员有发出命令的发出命令的职责,烤肉串师傅有执行命令的职责。
2、在必要的情况下,很容易地实现对请求的撤销和恢复操作。如实例中,就可以在服务员类中,创建一个订单集合,并添加add,remove等操作,可参考上面服务员类中的注释部分。
Success is the sum of small efforts, repeated day in and day out.