当前位置: 首页 > news >正文

Java 设计模式之命令模式

文章目录

  • Java 设计模式之命令模式
    • 概述
    • UML
    • 代码实现
      • 简单实现
      • 复杂实现

Java 设计模式之命令模式

概述

  • 命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
  • 敏捷开发原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。

UML

在这里插入图片描述

  • Command:命令接口,定义执行操作的通用接口。
  • ConcreteCommand:具体命令类,实现具体的命令操作,持有接受者对象。
  • Receiver:接收者累,实际执行操作的对象。
  • Invoker:调用者,触发命令的对象。

代码实现

简单实现

定义命令接口:

public interface Command {
    void execute();
}

定义具体命令类:

public class LightOffCommand implements Command {
    private Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOff();
    }
}
public class LightOnCommand implements Command {
    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOn();
    }
}

定义接收者类:

public class Light {
    public void turnOn() {
        System.out.println("开灯");
    }

    public void turnOff() {
        System.out.println("关灯");
    }
}

定义调用者类:

public class RemoteControl {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void pressButton() {
        command.execute();
    }
}

使用:

public class Client {
    public static void main(String[] args) {
        Light light = new Light();
        Command lightOn = new LightOnCommand(light);
        Command lightOff = new LightOffCommand(light);
        RemoteControl control = new RemoteControl();
        control.setCommand(lightOn);
        control.pressButton();
        control.setCommand(lightOff);
        control.pressButton();
    }
}

输出:

开灯
关灯

复杂实现

定义抽象命令类:

abstract class Command {
    protected RoastCook receiver;

    public Command(RoastCook receiver) {
        this.receiver = receiver;
    }

    abstract void execute();
}

定义接收者类:

public class RoastCook {
    public void bakeMeet() {
        System.out.println("烤肉");
    }

    public void bakeFish() {
        System.out.println("烤鱼");
    }
}

定义具体命令类:

public class RoastFishCommand extends Command {
    public RoastFishCommand(RoastCook receiver) {
        super(receiver);
    }

    @Override
    void execute() {
        receiver.bakeFish();
    }
}
public class RoastMeatCommand extends Command {
    public RoastMeatCommand(RoastCook receiver) {
        super(receiver);
    }

    @Override
    void execute() {
        receiver.bakeMeet();
    }
}

定义调用者类:

public class Waiter {
    private ArrayList<Command> orders = new ArrayList<>();
    private Command command;

    // 下单
    public void setOrder(Command command) {
        String className = command.getClass().getSimpleName();
        if (className.equals("RoastFishCommand")) {
            System.out.println("下单:" + "烤鱼");
        } else {
            System.out.println("下单:" + "烤肉");
        }
        orders.add(command);
    }

    // 取消订单
    public void cancelOrder(Command command) {
        String className = command.getClass().getSimpleName();
        if (className.equals("RoastFishCommand")) {
            System.out.println("取消:" + "烤鱼");
        } else {
            System.out.println("取消:" + "烤肉");
        }
        orders.remove(command);
    }

    // 通知
    public void notifyCommand() {
        for (Command command : orders) {
            command.execute();
        }
    }
}

使用:

public class Client {
    public static void main(String[] args) {
        RoastCook receiver = new RoastCook();
        Command roastMeatCommand = new RoastMeatCommand(receiver);
        Command roastFishCommand1 = new RoastFishCommand(receiver);
        Command roastFishCommand2 = new RoastFishCommand(receiver);
        Command roastFishCommand3 = new RoastFishCommand(receiver);
        Waiter waiter = new Waiter();
        waiter.setOrder(roastFishCommand1);
        waiter.setOrder(roastFishCommand2);
        waiter.setOrder(roastMeatCommand);
        waiter.setOrder(roastFishCommand3);
        waiter.cancelOrder(roastFishCommand2);
        waiter.notifyCommand();
    }
}

输出:

下单:烤鱼
下单:烤鱼
下单:烤肉
下单:烤鱼
取消:烤鱼
烤鱼
烤肉
烤鱼

相关文章:

  • 分布式 IO 模块:食品罐装产线自动化与高效运行的推手
  • 个人搭建CDN加速服务 特网科技
  • 解决vue-awesome-swiper 4.x + swiper 5.x 分页pagination配置不生效问题
  • Dify本地安装
  • 开源在线考试系统开源在线考试系统:支持数学公式的前后端分离解决方案
  • 动态内存管理
  • 栈与队列(C语言版)
  • 数据分析简介及其常用指标与方法
  • 毕业设计—基于Spring Boot的社区居民健康管理平台的设计与实现
  • java接口
  • DeepSeek教unity------Dotween
  • 部署postgresql_exporter监控pgsql
  • mysql增加字段操作以及关键字报错
  • MATLAB中regexpi函数用法
  • 想要追踪一个在传送带上运动的东西,该怎么选择工业相机呢,需要考虑哪些因素
  • 国产Linux OS:网络性能调优关键内核参数
  • 【医学影像AI】50个眼科影像数据集(1)分类任务
  • 软件测试技术之跨平台的移动端UI自动化测试(上)
  • VSCode 中使用 Snippets 设置常用代码块
  • 数据结构:顺序表(Sequence List)及其实现
  • 海外市场,押注中国无人驾驶龙头
  • 国内规模最大女子赛艇官方赛事在沪启航,中外41支队伍逐浪
  • 泽连斯基:俄代表团级别低,没人能做决定
  • 科普|认识谵妄:它有哪些表现?患者怎样走出“迷雾”?
  • 新修订的《餐饮业促进和经营管理办法》公布,商务部解读
  • 王东杰评《国家与学术》︱不“国”不“故”的“国学”