行为型设计模式——命令模式

这篇具有很好参考价值的文章主要介绍了行为型设计模式——命令模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

命令模式

日常生活中,我们出去吃饭都会遇到下面的场景。

行为型设计模式——命令模式,技术提升篇,设计模式,命令模式,Java命令模式,Java

定义: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。命令模式包含以下主要角色:

  • 抽象命令类(Command)角色: 定义命令的接口,声明执行的方法。
  • 具体命令(Concrete Command)角色:具体的命令,实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
  • 实现者/接收者(Receiver)角色: 接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
  • 调用者/请求者(Invoker)角色: 要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

案例实现

我们以一个美团外卖接单的例子来实现命令模式,假设你开了一家外卖饭店,角色有老板、厨师和接到的订单(命令类),
将上面的案例用代码实现,那我们就需要分析命令模式的角色在该案例中由谁来充当。

  • 老板: 就是调用者角色,由她来向后厨厨师发起做菜的命令。
  • 大厨: 就是接收者角色,真正命令执行的对象。
  • 订单: 命令,命令中就包含了订单。

类图如下:
行为型设计模式——命令模式,技术提升篇,设计模式,命令模式,Java命令模式,Java

代码如下:

首先定义订单类、接受者类(厨师):

// 订单类
public class Order {
    // 订单
    private long ID;
    // 用来存储餐名并记录份数
    private Map<String, Integer> foodDic = new HashMap<String, Integer>();

    public long getID() {
        return ID;
    }
    public void setID(long ID) {
        this.ID = ID;
    }
    public Map<String, Integer> getFoodDic() {
        return foodDic;
    }
    public void setFoodDic(String name, int num) {
        foodDic.put(name,num);
    }
}

// 厨师类
public class Chef {
    public void makeFood(int num,String foodName){
        System.out.println("已经做好"+num + "份" + foodName);
    }
}

然后定义命令接口并和它的具体实现:

// 命令接口
public interface Command {
    void execute(); // 命令执行方法
}

// 具体订单命令
public class OrderCommand implements Command{
    // 命令接受者对象
    private Chef receiver;
    private Order order;
    public OrderCommand(Chef receiver, Order order){
        this.receiver = receiver;
        this.order = order;
    }

    // 命令执行方法:命令接受者处理命令 
    @Override
    public void execute() {
        System.out.println("订单号:"+order.getID());
        Set<String> keys = order.getFoodDic().keySet();
        for (String key : keys) {
            receiver.makeFood(order.getFoodDic().get(key),key);
        }

        try {
            Thread.sleep(100);//停顿一下 模拟做饭的过程
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(order.getID() + "订单的饭弄好了");
    }
}

最后定义命令发出者(老板)类:

public class Boss {
    private ArrayList<Command> commands;//老板美团可以接很多单,可以持有很多的命令对象

    public Boss() {
        commands = new ArrayList();
    }

    // 不断接单
    public void setCommand(Command cmd){
        commands.add(cmd);
    }

    // 向后厨发出命令您有新的订单,厨师开始执行
    public void orderUp() {
        System.out.println("张师傅,该工作了,新订单来了.......");
        for (int i = 0; i < commands.size(); i++) {
            Command cmd = commands.get(i);
            if (cmd != null) {
                cmd.execute();
            }
        }
    }
}

客户类测试:

public class Main {
    public static void main(String[] args) {
        //创建2个order
        Order order1 = new Order();
        order1.setID(1);
        order1.getFoodDic().put("西红柿鸡蛋面",1);
        order1.getFoodDic().put("小杯可乐",2);

        Order order2 = new Order();
        order2.setID(3);
        order2.getFoodDic().put("尖椒肉丝盖饭",1);
        order2.getFoodDic().put("小杯雪碧",1);

        //创建接收者
        Chef receiver=new Chef();
        //将订单和接收者封装成命令对象
        OrderCommand cmd1 = new OrderCommand(receiver, order1);
        OrderCommand cmd2 = new OrderCommand(receiver, order2);
        //创建调用者 Boss 向后厨师傅发出做饭命令
        Boss invoker = new Boss();
        invoker.setCommand(cmd1); // 接单
        invoker.setCommand(cmd2); // 接单
        //将订单带到柜台 并向厨师喊 订单来了
        invoker.orderUp();
    }
}

结果输出:

张师傅,该工作了,新订单来了…
订单号:1
已经做好1份西红柿鸡蛋面
已经做好2份小杯可乐
1订单的饭弄好了
订单号:3
已经做好1份尖椒肉丝盖饭
已经做好1份小杯雪碧
3订单的饭弄好了

优点

  • 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
  • 增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”,对扩展比较灵活。
  • 可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
  • 方便实现 Undo 和 Redo 操作。命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复。

缺点

  • 使用命令模式可能会导致某些系统有过多的具体命令类。
  • 系统结构更加复杂。

使用场景

  • 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
  • 系统需要在不同的时间指定请求、将请求排队和执行请求。
  • 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

JDK源码解析

Runable是一个典型命令模式,Runnable担当命令的角色,Thread充当的是调用者,start方法就是其执行方法。

参考内容

传智播客设计模式相关笔记(主要)文章来源地址https://www.toymoban.com/news/detail-798955.html

到了这里,关于行为型设计模式——命令模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 行为型设计模式——命令模式

    日常生活中,我们出去吃饭都会遇到下面的场景。 定义: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。命令模式包含以下主要角色: 抽象命令类(

    2024年01月17日
    浏览(33)
  • 设计模式之命令模式【行为型模式】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博

    2024年02月01日
    浏览(29)
  • 设计模式—行为型模式之命令模式

    命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。 命令模式包含以下主要角色。 抽象命令类(Command)角色:声明执行命令的接口,

    2024年01月25日
    浏览(31)
  • 笨蛋学设计模式行为型模式-命令模式【19】

    8.6.1概念 ​ 命令模式允许将请求封装成一个对象(命令对象,包含执行操作所需地所有信息),并将命令对象按照一定的顺序存储在队列中,然后再逐一调用执行,这些命令可以支持反向操作,进行撤销和重做。这样发送者就只需要触发命令就可以完成操作,不需要知道接受者

    2024年01月23日
    浏览(28)
  • 设计模式(016)行为型之命令模式

            命令模式,它将请求封装成一个对象,从而允许客户端参数化操作队列、记录请求日志、支持撤销操作等。在命令模式中,有四个核心角色:命令接口(Command)、具体命令(ConcreteCommand)、调用者(Invoker)、接收者(Receiver)。 ① 命令接口(Command) :声明了执

    2024年04月11日
    浏览(32)
  • 【设计模式】第16节:行为型模式之“命令模式”

    命令模式:将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能。 动作封装 解耦发送者跟接受者 可扩展性 简化和集中错误处理 支持撤

    2024年02月07日
    浏览(25)
  • 【设计模式|行为型】命令模式(Command Pattern)

    命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,以便在不同的请求者和接收者之间进行解耦、参数化和操作的队列化。命令模式允许你将具体的请求封装为对象,这些对象之间彼此独立,并且可以用不同的请求对客户端进行参数化。 结构 命令接口

    2024年02月15日
    浏览(28)
  • 掌握设计模式:深入了解命令模式的优雅调度与行为解耦

    命令模式是一种行为设计模式,其目的是将请求发送者和接收者解耦,从而允许发送者发送请求,而无需知道请求的具体处理方式。在命令模式中,请求被封装为一个对象,这个对象包含了执行请求所需的所有信息,包括调用方法、参数等。这样,请求的发送者只需知道如何

    2024年01月25日
    浏览(40)
  • 《golang设计模式》第三部分·行为型模式-02-命令模式(Command)

    命令模式(Command)将类的业务行为以对象的方式封装,以便实现行为的参数化、撤销或重做等需求。 非命令模式的困惑: 类的行为在运行时是以实例方法的形式调用的,当方法执行完毕并返回后,方法栈将会消除;方法的运行状态(主要指局部变量)保存在栈帧中,它会随

    2024年02月07日
    浏览(27)
  • 【十五】设计模式~~~行为型模式~~~状态模式(Java)

    【学习难度:★★★☆☆,使用频率:★★★☆☆】 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包