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

设计模式之命令设计模式

  • 命令设计模式(Command Pattern)

    • 请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的对象,并把该命令传给相应的对象执行命令,属于行为型模式
    • 命令模式是一种特殊的策略模式,体现的是多个策略执行的问题,而不是选择的问题
  • 应用场景

    • 只要你认为是命令的地方,就可以采用命令模式
    • 日常每个界面、按钮、键盘事件操作都是命令设计模式
  • 角色

    • 抽象命令(Command):需要执行的所有命令都在这里声明

    • 具体命令(ConcreteCommand):定义一个接收者和行为之间的弱耦合,实现execute()方法,负责调用接收者的相应操作,execute()方法通常叫做执行方法

    • 接收者(Receiver):负责具体实施和执行一个请求,干活的角色,命令传递到这里是应该被执行的,实施和执行请求的方法叫做行动方法

    • 请求者(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法

    • 客户端(Client):创建一个具体命令,ConcreteCommand对象并确定其接收者

      在这里插入图片描述

  • 代码示例,以空调开、关、制冷为例

    /**
     * 命令执行者:包含具体命令
     */
    class ConditionReceiver {
        public void on() {
            System.out.println("空调开启了");
        }
    
        public void cool() {
            System.out.println("空调开始制冷");
        }
    
        public void off() {
            System.out.println("空调关闭了");
        }
    }
    
    /**
     * 抽象命令
     */
    interface Command {
        /**
         * 执行动作
         */
        void execute();
    }
    
    /**
     * 具体命令:开机
     */
    class OnCommand implements Command {
    
        /**
         * 对哪个receiver进行命令处理
         */
        private ConditionReceiver receiver;
    
        public OnCommand(ConditionReceiver receiver) {
            this.receiver = receiver;
        }
    
        @Override
        public void execute() {
            System.out.println("OnCommand-->execute");
            receiver.on();
        }
    }
    
    /**
     * 具体命令:制冷
     */
    class CoolCommand implements Command {
    
        /**
         * 对哪个receiver进行命令处理
         */
        private ConditionReceiver receiver;
    
        public CoolCommand(ConditionReceiver receiver) {
            this.receiver = receiver;
        }
    
        @Override
        public void execute() {
            System.out.println("CoolCommand-->execute");
            receiver.cool();
        }
    }
    
    /**
     * 具体命令:关机
     */
    class OffCommand implements Command {
    
        /**
         * 对哪个receiver进行命令处理
         */
        private ConditionReceiver receiver;
    
        public OffCommand(ConditionReceiver receiver) {
            this.receiver = receiver;
        }
    
        @Override
        public void execute() {
            System.out.println("OffCommand-->execute");
            receiver.off();
        }
    }
    
    /**
     * 请求者
     */
    class AppInvoker {
        private Command onCommand;
        private Command coolCommand;
        private Command offCommand;
    
        public void setOnCommand(Command onCommand) {
            this.onCommand = onCommand;
        }
    
        public void setCoolCommand(Command coolCommand) {
            this.coolCommand = coolCommand;
        }
    
        public void setOffCommand(Command offCommand) {
            this.offCommand = offCommand;
        }
    
        /**
         * 开机
         */
        public void on() {
            onCommand.execute();
        }
    
        /**
         * 制冷
         */
        public void cool() {
            coolCommand.execute();
        }
    
        /**
         * 关机
         */
        public void off() {
            offCommand.execute();
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            // 创建接收者,空调就是接收者
            ConditionReceiver receiver = new ConditionReceiver();
            // 创建命令对象,设置命令的接收者
            OnCommand onCommand = new OnCommand(receiver);
            CoolCommand coolCommand = new CoolCommand(receiver);
            OffCommand offCommand = new OffCommand(receiver);
            // 创建请求者,把命令对象设置进去,app就是请求发起者
            AppInvoker appInvoker = new AppInvoker();
            appInvoker.setOnCommand(onCommand);
            appInvoker.setCoolCommand(coolCommand);
            appInvoker.setOffCommand(offCommand);
    
            appInvoker.on();
            appInvoker.cool();
            appInvoker.off();
        }
    }
    
  • 优点

    • 调用者角色与接收者角色之间没有任何依赖关系,不需要了解到底是哪个接收者执行,降低了系统耦合度
    • 扩展性强,新的命令可以很容易添加到系统中去
  • 缺点

    • 过多的命令模式会导致某些系统有过多的具体命令类

相关文章:

  • 墨香阁-测试报告
  • 星越L_电动车窗使用及初始化讲解
  • Ai智能体四:互动式 AI 聊天助手:前端实现
  • 【PHP】新版本特性记录(持续更新)
  • el-table表格样式设置单元格样式方法 :cell-class-name
  • Vue3 Pinia $subscribe localStorage的用法 Store的组合式写法
  • Postman中Authorization和Headers的区别
  • 《图解设计模式》 学习笔记
  • 基于Grafana+Prometheus的IB网卡硬件计数器监控方案
  • 深入解析工厂模式及其C#实现
  • node.js-node.js作为服务器,前端使用WebSocket(单个TCP连接上进行全双工通讯的协议)
  • 70.HarmonyOS NEXT PicturePreview组件深度剖析:从架构设计到核心代码实现
  • 560.和为k的子数组
  • mysql索引讲解
  • 深入理解 Reactor Netty 线程配置及启动命令设置
  • 洛谷 P1068 [NOIP 2009 普及组] 分数线划定 python
  • rust学习笔记14-函数
  • SSO单点登录
  • FLASK和GPU依赖安装
  • Ollama+OpenManus详细部署实战
  • 证监会:2024年依法从严查办证券期货违法案件739件,作出处罚决定592件、同比增10%
  • 爱德华多·阿拉纳宣誓就任秘鲁新总理
  • 广东省原省长卢瑞华逝世,享年88岁
  • 福建厦门市副市长、市公安局局长陈育煌出任吉林省公安厅厅长
  • A股三大股指涨跌互现:银行股领涨,两市成交12915亿元
  • 比特币挖矿公司GRYP股价涨超171%:将与特朗普儿子创设的公司合并