【设计模式--行为型--命令模式】

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

命令模式

定义

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

结构

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

案例

饭店点餐:顾客把订单给服务员,服务员把订单给厨师,厨师做菜。

  • 服务员:请求者,由她向厨师发起命令
  • 厨师:接收者,真正执行命令的对象
  • 订单:命令中包含订单
    类图:
    【设计模式--行为型--命令模式】,设计模式,设计模式,命令模式
/**
 * 抽象命令类
 */
public interface Command {
    void execute();
}
/**
 * 具体命令类
 */
public class OrderCommand implements Command{

    // 持有接收者对象
    private SeniorChef seniorChef;
    private Order order;

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

    @Override
    public void execute() {
        System.out.println(order.getDiningTable() + "卓的订单:");
        Map<String, Integer> foodDir = order.getFoodDir();
        Set<String> keys = foodDir.keySet();
        for (String foodName : keys){
            seniorChef.makeFood(foodName,foodDir.get(foodName));
        }
        System.out.println(order.getDiningTable() + "卓的饭好了---");
    }
}
/**
 * 订单类
 */
public class Order {
    // 餐桌号码
    private int diningTable;
    // 餐品及数量
    private Map<String, Integer> foodDir = new HashMap<>();

    public int getDiningTable() {
        return diningTable;
    }

    public void setDiningTable(int diningTable) {
        this.diningTable = diningTable;
    }

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

    public void setFoodDir(Map<String, Integer> foodDir) {
        this.foodDir = foodDir;
    }

    public void setFood(String name, int num) {
        foodDir.put(name, num);
    }
}
/**
 * 厨师类
 */
public class SeniorChef {
    public void makeFood(String name, int num){
        System.out.println(num+"份"+name);
    }
}
/**
 * 服务员角色  请求者
 */
public class Waitor {
    // 持有多个命令
    private List<Command> commands = new ArrayList<>();

    public List<Command> getCommands() {
        return commands;
    }

    public void setCommands(Command command) {
        commands.add(command);
    }
    // 发起命令的方法
    public void orderUp(){
        System.out.println("服务员说:新订单来了");
        for (Command command : commands) {
            if (command != null){
                command.execute();
            }
        }
    }
}
public class Test01 {
    public static void main(String[] args) {
        // 订单对象
        Order order = new Order();
        order.setDiningTable(1);
        order.setFood("炒土豆丝",1);
        order.setFood("可乐",1);

        Order order1 = new Order();
        order1.setDiningTable(2);
        order1.setFood("面条", 1);

        // 厨师对象
        SeniorChef seniorChef = new SeniorChef();
        // 创建命令对象
        OrderCommand orderCommand = new OrderCommand(seniorChef, order);
        OrderCommand orderCommand1 = new OrderCommand(seniorChef, order1);
        // 创建调用者,服务员
        Waitor waitor = new Waitor();
        waitor.setCommands(orderCommand);
        waitor.setCommands(orderCommand1);
        // 发起命令
        waitor.orderUp();
    }
}

【设计模式--行为型--命令模式】,设计模式,设计模式,命令模式文章来源地址https://www.toymoban.com/news/detail-758983.html

优缺点

  • 优点
    • 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
    • 增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,满足开闭原则,对扩展比较灵活。
    • 可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
    • 方便实现Undo和Redo操作。命令模式可以与备忘录模式结合,实现命令的撤销与恢复。
  • 缺点
    • 使用命令模式可能会导致某些系统有过多的具体命令类。
    • 系统结构更加复杂。

使用场景

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

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

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

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

相关文章

  • 设计模式之命令模式【行为型模式】

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

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

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

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

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

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

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

    2024年02月07日
    浏览(34)
  • 【Java 设计模式】行为型之命令模式

    命令模式(Command Pattern)是一种行为型设计模式,用于将请求封装为对象,使得可以参数化客户端对象,并且能够排队、记录请求,以及支持撤销操作。在本文中,我们将深入研究Java中命令模式的定义、结构、使用场景以及如何在实际开发中应用。 命令模式是一种行为型设

    2024年01月23日
    浏览(43)
  • 【设计模式|行为型】命令模式(Command Pattern)

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

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

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

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

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

    2024年02月07日
    浏览(42)
  • Java设计模式之行为型-命令模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、点餐案例  五、总结 1、将一个请求封装为一个对象,使您可以用不同的请求对客户进行参数化。 2、对请求排队或记录请求日志,以及支持可撤销的操作。 3、将命令对象与执行命令的对象分离,

    2024年02月16日
    浏览(36)
  • 【设计模式与范式:行为型】71 | 命令模式:如何利用命令模式实现一个手游后端架构?

    设计模式模块已经接近尾声了,现在我们只剩下 3 个模式还没有学习,它们分别是:命令模式、解释器模式、中介模式。这 3 个模式使用频率低、理解难度大,只在非常特定的应用场景下才会用到,所以,不是我们学习的重点,你只需要稍微了解,见了能认识就可以了。 今天

    2024年02月09日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包