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

大话设计模式——16.命令模式(Command Pattern)

简介

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

UML图

在这里插入图片描述

应用场景
  • 界面选择、键盘、按钮、事件操作都类似命令模式

示例

电视遥控器、电视、观看电视的人

  1. 接收者:电视机
public class TVReceiver {public void on() {System.out.println("打开电视");}public void off() {System.out.println("关闭电视");}public void changeStation() {System.out.println("换台");}
}
  1. 命令(指令):
public interface Command {void excute();
}
public class OnCommand implements Command {private TVReceiver tvReceiver;public OnCommand(TVReceiver tvReceiver) {this.tvReceiver = tvReceiver;}@Overridepublic void excute() {System.out.println("onCommand----execute");tvReceiver.on();}
}
public class OffCommand implements Command {private TVReceiver tvReceiver;public OffCommand(TVReceiver tvReceiver) {this.tvReceiver = tvReceiver;}@Overridepublic void excute() {System.out.println("OffCommand----execute");tvReceiver.off();}
}
public class ChangeStationCommand implements Command {private TVReceiver tvReceiver;public ChangeStationCommand(TVReceiver tvReceiver) {this.tvReceiver = tvReceiver;}@Overridepublic void excute() {System.out.println("ChangeStationCommand----execute");tvReceiver.changeStation();}
}
  1. 调用者:观看者
public class Invoker {private OnCommand onCommand;private OffCommand offCommand;private ChangeStationCommand changeStationCommand;public OnCommand getOnCommand() {return onCommand;}public void setOnCommand(OnCommand onCommand) {this.onCommand = onCommand;}public OffCommand getOffCommand() {return offCommand;}public void setOffCommand(OffCommand offCommand) {this.offCommand = offCommand;}public ChangeStationCommand getChangeStationCommand() {return changeStationCommand;}public void setChangeStationCommand(ChangeStationCommand changeStationCommand) {this.changeStationCommand = changeStationCommand;}/*** 开*/public void on() {onCommand.excute();}/*** 关*/public void off() {offCommand.excute();}/*** 换台*/public void changeStation() {changeStationCommand.excute();}
}
  1. 运行
public class Main {public static void main(String[] args) {// 创建接收者(物品)TVReceiver tvReceiver = new TVReceiver();// 创建指令(遥控器)OnCommand onCommand = new OnCommand(tvReceiver);OffCommand offCommand = new OffCommand(tvReceiver);ChangeStationCommand changeStationCommand = new ChangeStationCommand(tvReceiver);// 创建使用者Invoker invoker = new Invoker();invoker.setOffCommand(offCommand);invoker.setOnCommand(onCommand);invoker.setChangeStationCommand(changeStationCommand);// 使用者作出指示invoker.on();System.out.println("------------");invoker.changeStation();System.out.println("------------");invoker.off();}
}

在这里插入图片描述

总结

  • 优点

    • 调用者对象与接受者对象没有任何依赖关系,降低了系统的耦合度
    • 方便新的命令添加至系统中,扩展性强
  • 缺点

    • 过多的命令会导致系统中存在过多的具体命令类
http://www.lryc.cn/news/335612.html

相关文章:

  • react17+18 中 setState是同步还是异步更新
  • Unity框架,ET框架8.1版本的打包流程记录
  • windows访问wsl中的docker
  • golang主要优缺点
  • 浅谈Redis和一些指令
  • AI大模型探索之路-应用篇1:Langchain框架概述—快速构建大模型应用
  • Google Chrome 常用设置
  • 如何提高旋转花键运行稳定性?
  • 每日一题 第八十七期 洛谷 [蓝桥杯 2018 省 AB] 全球变暖
  • AI技术创业有哪些机会?
  • TensorFlow学习之:基础概念和操作
  • 最新在线工具箱网站系统源码
  • c# InvokeRequested delegate解决线程访问界面
  • 使用 Web Workers 作为setInterval的替代方案
  • python实现将日期文本化
  • react ant design 通过函数弹出 modal窗口
  • 力扣刷题Days33-209. 长度最小的子数组(js)
  • 面对DDOS攻击,有哪些解决办法
  • C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组
  • 免费-华为od-C卷-javascript-动态规划-贪心歌手.js
  • elementui 实现一个固定位置的Pagination(分页)组件
  • 紧急备考全攻略,如何短期通过PMP考试?
  • python开发poc,fofa爬虫批量化扫洞
  • 适用于 Windows 10 的 10 大免费数据恢复软件
  • zabbix企业级监控平台
  • 如何关闭WordPress的自动更新功能
  • 【分析 GClog 的吞吐量和停顿时间、heapdump 内存泄漏分析】
  • [STL-list]介绍、与vector的对比、模拟实现的迭代器问题
  • 代码随想录-035期-算法训练营【博客笔记汇总表】
  • postgresql数据库|数据整合的好工具--Oracle-fdw的部署和使用