命令模式

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();
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值