Java设计模式之命令模式

命令模式解析
本文通过一个饭店点餐的例子,详细介绍了软件设计中的命令模式。包括抽象命令接口、接收者、具体命令及调用者的定义,展示了如何通过命令模式实现请求的封装、参数化以及支持撤销操作。

命令模式

将一个请求封装为一个对象(即我们创建的Command对象),从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。

代码展示

  1. 定义一个抽象的命令接口

    public interface Command {

     void execute();复制代码

    }

  2. 定义一个 Receiver 负责执行命令

    public class Receiver {

     public void doSomething() {
          System.out.println("番茄炒西红柿");  
     }复制代码

    }

  3. 定义一个具体的命令, 创建命令的时候会指定命令的执行者 Receiver

    public class ConcreteCommand implements Command {

     private Receiver receiver;
    
     public ConcreteCommand(Receiver receiver) {
         this.receiver = receiver;
     }
    
     @Override
     public void execute() {
         receiver.doSomething();
     }复制代码

    }

  4. 定义一个调用者 Invoker

    public class Invoker {

     private Command command;
    
     public void setCommand(Command command) {
         this.command = command;
     }
    
     public void action() {
         command.execute();
     }复制代码

    }

  5. 定义一个Client类

    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.action();
     }复制代码

    }

角色介绍

情景: 饭店里一个客户在看菜单, 服务员在下单, 厨师在后厨做菜.

客户: Client; 服务员: Invoker ; 厨师: Receiver; 番茄炒西红柿: ConcreteCommand

这个就是准备好的菜单:

Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);复制代码

如果客户要退菜就得告诉服务员番茄炒西红柿不要了. 同理如果客户觉得番茄炒西红柿很好吃可以再加一份.所以命令的取消和重新发起逻辑应该是由服务员(Invoker) 来实现的. 然而我常常遇到的情况是服务员说菜已经好了. 那就没有办法退菜(取消命令)了.

转载于:https://juejin.im/post/59ffc276f265da43333dc8b7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值