设计模式之命令模式

命令模式

定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分隔开,这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储,传递,调用,增加和管理

命令模式主要角色结构如下:

抽象命令类角色:定义命令的接口,声明执行方法

具体命令角色:具体的命令,实现命令接口,通常会持有接收者(实现者),并调用接收者的功能来完成命令要执行的操作

实现者/接收者角色:接收者,真正执行命令的对象,任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能

调用者/请求者角色:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象,这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口


案例实现

餐厅客户进行点餐,提供需要点的餐品以及份数,服务员纪录下来形成订单,其中包括餐桌好,菜品,份数等信息,交由后厨进行制作。在改案例中服务员就是调用者角色,由他发起命令。后厨就是接收者对象,,真正命令执行的对象,在命令中包含订单信息

代码实现如下:

定义抽象命令接口

   public interface Command {
   void execute();
   }

定义订单类

public class Order {
   //餐桌号
   private Integer diningTable;

   //食物名称和份数的集合
   private Map<String,Integer> foodDir=new HashMap<>();

   public Integer getDiningTable() {
       return diningTable;
   }
   public void setDiningTable(Integer diningTable) {
       this.diningTable = diningTable;
   }

   public Map<String, Integer> getFoodDir() {
       return foodDir;
   }

   public void setFoodDir(String name,Integer num) {
       foodDir.put(name,num);
   }
}

定义厨师类

public class SeniorChef {
   //食物制作
   void makeFood(String name,int num){
       System.out.println("制作"+num+"份"+name+"食物完成");
   }
}

定义具体命令类,其中组合了订单对象和后厨对象,通过execute方法将后厨制作订单相应份数的食物

public class OrderCommand implements Command{
   private Order order;
   private SeniorChef seniorChef;

   public OrderCommand(Order order,SeniorChef seniorChef){
       this.order=order;
       this.seniorChef=seniorChef;
   }

   @Override
   public void execute() {
       System.out.println("开始制作"+order.getDiningTable()+"号餐桌的食物");
       Map<String,Integer> food=order.getFoodDir();
       food.forEach((key,value)->{
           seniorChef.makeFood(key,value);
       });
       System.out.println(order.getDiningTable()+"号桌的食物已经制作完成了");
   }
}

定义调用者类,服务员,通过调用命令的执行方法吩咐后厨制作相应的食物

public class Waitor {
   //可以存在多个命令
   private List<Command> commandList=new ArrayList<>();


   public void setCommand(Command command){
       commandList.add(command);
   }

   public void invoke(){
       commandList.forEach(Command::execute);
   }
}

测试类测试命令模式

public static void main(String[] args) {
   //创建订单对象
   Order order1=new Order();
   order1.setDiningTable(1);
   order1.setFoodDir("牛腩饭",1);

   //创建订单对象
   Order order2=new Order();
   order2.setDiningTable(2);
   order2.setFoodDir("梅菜扣肉",2);

   //创建厨师类
   SeniorChef seniorChef=new SeniorChef();

   //创建订单命令
   OrderCommand orderCommand1=new OrderCommand(order1,seniorChef);
   OrderCommand orderCommand2=new OrderCommand(order1,seniorChef);


   //创建服务员对象
   Waitor waitor=new Waitor();

   waitor.setCommand(orderCommand1);
   waitor.setCommand(orderCommand2);

   waitor.invoke();
}

命令模式优缺点

优点

降低系统的耦合度,命令模式能将调用者操作的对象与实现该操作的对象解耦

增加或删除命令非常方便,采用命令模式增加与删除命令不会影响其他类,它满足开闭原则,对扩展比较灵活

可以实现宏命令,命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令

命令模式和备忘录模式结合实现命令的撤销与恢复

缺点

使用命令模式可能会导致某些系统有过多的具体命令类

系统结构更加复杂

命令模式适用场景

系统需要将调用者和实现者进行解耦,使得调用者和实现者不直接交互

系统在不同的时间指定请求,将请求排队和执行请求

系统需要支持命令的撤销和恢复操作


希望这篇文章对您有帮助,同时也希望您在闲暇之余能够帮忙使用微信扫一下下面的小程序二维码帮忙助力一下小程序的访问量,谢谢

微信小程序二维码

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值