首页 > 其他分享 >设计模式之命令模式

设计模式之命令模式

时间:2024-06-10 09:59:48浏览次数:26  
标签:对象 接收者 模式 public 命令 设计模式 order

文章目录

概述

先来个定义,如下:
命令模式(command pattern)的定义: 命令模式将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不 同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等 (附加控制)功能。

命令模式的核心是将指令信息封装成一个对象,并将此对象作为参数发送给接收方去执行,达到使命令的请求与执行方解耦,双方只通过传递各种命令对象来完成任务。

原理

原理图
原理如上图所示。

命令模式包含以下主要角色:

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

命令模式实现

模拟酒店后厨的出餐流程,来对命令模式进行一个演示,命令模式角色的角色与案例中角色的对应关系如下:

  • 服务员: 即调用者角色,由她来发起命令.
  • 厨师: 接收者,真正执行命令的对象.
  • 订单: 命令中包含订单
public class Order {

    private int diningTable;  
    
    private Map<String,Integer> foodMenu = new HashMap<>();

    public int getDiningTable() {
        return diningTable;
    }

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

    public Map<String, Integer> getFoodMenu() {
        return foodMenu;
    }

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

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.getDiningTable() + "桌的订单: ");
        Set<String> keys = order.getFoodMenu().keySet();
        for (String key : keys) {
            receiver.makeFood(order.getFoodMenu().get(key),key);
        }

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(order.getDiningTable() + "桌的菜已上齐.");
    }
}

public class Waiter {

    //可以持有很多的命令对象
    private ArrayList<Command> commands;

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

    public Waiter(ArrayList<Command> commands) {
        this.commands = commands;
    }

    public void setCommands(Command command) {
        commands.add(command);
    }

    //发出命令 ,指挥厨师工作
    public void orderUp(){
        System.out.println("服务员: 叮咚,有新的订单,请厨师开始制作......");
        for (Command cmd : commands) {
            if(cmd != null){
                cmd.execute();
            }
        }
    }
}

其他案例

这种方式,其实在lanchain中也经常出现,像它最新的代码。都可以去参考下,当然,ue底层代码也很常用。

命令模式优缺点小结

1) 命令模式优点:

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

2) 命令模式缺点:

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

3) 使用场景

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

标签:对象,接收者,模式,public,命令,设计模式,order
From: https://blog.csdn.net/Vjunjun/article/details/139571001

相关文章

  • JDK23新特性:通过原始类型模式提升代码编写效率
    在JEP455中包含了通过增强switch语句,简化了代码编写,以及提高了代码的可读性。1.相关优化原始类型模式:您可以int,long,boolean在模式匹配结构中直接使用原始类型(例如等)。这样就无需对值进行不必要的装箱和拆箱。扩展的instanceof和switch:运算instanceof符和switch表达......
  • 简单工厂模式( Simple Factory Pattern )
    简单工厂模式(SimpleFactoryPattern),在工厂类中对象决定创建出哪一种产品类的实例。这些产品类都实现了相同的接口,或者继承了相同的父类。结构图Factory(工厂角色):它是核心,负责实现创建所有实例的内部逻辑。在工厂类中,提供了一个静态方法,可以直接被外界直接调用,以创建具体产品......
  • 服务器linux系统 Debian 更新安全补丁命令
    服务器linux系统Debian更新安全补丁命令服务器换成Debian系统了,之前用的是centos系统,不过后续不支持更新还是什么,所以换成Debian系统,拿到系统首先是update更新了,把安全补丁打到最新。收集了一些命令,自用收藏。 Debian使用来自存储库的deb软件包来管理Debian系统上软件......
  • Android 13.0 Launcher3单层模式workspace中app列表页排序功能实现
    1.概述在13.0的定制化开发中,对于Launcher3的功能定制也是好多的,而对于单层app列表页来说排序功能的开发,也是常有的功能这就需要了解加载app数据的流程,然后根据需要进行排序就可以了,接下来就来实现这个功能如图:2.Launcher3单层模式workspace中app列表页排序功能实现的核心......
  • 探索Linux网络利器:netstat命令
    探索Linux网络利器:netstat命令在Linux系统管理中,了解系统的网络状态是至关重要的。而netstat命令就是这样一个强大的工具,它可以帮助我们查看网络连接、路由表、接口统计等与网络相关的信息。下面,我们将详细探讨如何使用netstat命令以及它的各种选项。1.netstat命令简介n......
  • Go 接收命令行参数
    在Go语言中,可以使用标准库中的os包和flag包来接收和处理命令行参数。使用os包os.Args是一个字符串切片,其中第一个元素是程序的名称,后续元素是传递给程序的命令行参数。示例代码packagemainimport("fmt""os")funcmain(){//os.Args[0]是程序......
  • 【运维必备知识】Linux系统平均负载与top、uptime命令详解
    【运维必备知识】Linux系统平均负载与top、uptime命令详解大家好,我是秋意零工作中,服务出现问题如何排查Linux系统侧。首先第一想到应该排查是否是负载过高导致的。今天,这篇就来看看,top、uptime命令中平均负载(loadaverage)相关内容,初学者应该关注都比较少(也包括我。。)top......
  • zz Spring 是一种反模式
    Java将会消亡–MartinVysny–第一性原理思考原文标题“Java将会消亡”,我并不认可Java会消亡一说,作者还处于FP亢奋期,而我已经从FP回归OO,这个话题有机会再展开。”Spring是一种反模式”是第二节的标题。让我们引用一下原文:Spring是一种反模式正如上面演示的......
  • 单例模式
    单例模式(SingletonPattern),保证一个类只有一个实例,并提供一个全局访问点以供外部代码使用。结构图定义一个私有成员变量instance;构造函数为private私有的;声明了一个名为getInstance的public公有静态方法,返回其唯一实例,供客户端Client使用。单例核心代码(Java实现)publiccl......
  • 2024050801-重学 Java 设计模式《实战策略模式》
    重学Java设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」一、前言文无第一,武无第二不同方向但同样努力的人,都有自身的价值和亮点,也都是可以互相学习的。不要太过于用自己手里的矛去攻击别人的盾......