Java设计模式——命令模式

2023-11-01

文章目录

命令模式

命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:
在这里插入图片描述
Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:

public interface Command {  
    public void exe();  
}  
public class MyCommand implements Command {  
  
    private Receiver receiver;  
      
    public MyCommand(Receiver receiver) {  
        this.receiver = receiver;  
    }  
  
    @Override  
    public void exe() {  
        receiver.action();  
    }  
}  
public class Receiver {  
    public void action(){  
        System.out.println("command received!");  
    }  
}  
public class Invoker {  
      
    private Command command;  
      
    public Invoker(Command command) {  
        this.command = command;  
    }  
  
    public void action(){  
        command.exe();  
    }  
}  
public class Test {  
  
    public static void main(String[] args) {  
        Receiver receiver = new Receiver();  
        Command cmd = new MyCommand(receiver);  
        Invoker invoker = new Invoker(cmd);  
        invoker.action();  
    }  
}  

这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!

介绍
意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。

关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口

应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。

优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。

缺点:使用命令模式可能会导致某些系统有过多的具体命令类。

使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。

注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java设计模式——命令模式 的相关文章

随机推荐

  • 使用ppocr突然退出问题

    本次使用conda装了一个cuda10 2版本的paddleocr 然后所有的环境检查没问题 使用paddle自带的检查代码 输出提醒paddle可以正常使用 gt gt gt import paddle gt gt gt paddle u
  • QT 鼠标事件及labe显示设置总结

    qt鼠标事件总结 转 1 QMouseEvent中的坐标 QMouseEvent中保存了两个坐标 一个是全局坐标 当然另外一个是局部坐标 全局坐标 globalPos 即是桌面屏幕坐标 screen coordinates 这个跟windo
  • Edge浏览器查看请求头(2022)

    目录 如何查看 使用公开的 如何查看 OK如果大家找不到的话可以用下面的这些在网上已经公开的请求头 使用公开的 Mozilla 5 0 Windows NT 10 0 Win64 x64 AppleWebKit 537 36 KHTML l
  • 报错 java.lang.NoClassDefFoundError: Lcom/sun/tools/javac/util/List;

    解决办法 全局搜索javac 找到引用的地方 import com sun tools javac util List 把它删除 重新引用 import java util List 原因 jar包引用错误
  • C++(18)——智能指针unique_ptr

    简介 unique ptr 是 C 11 提供的用于防止内存泄漏的智能指针中的一种实现 独享被管理对象指针所有权的智能指针 unique ptr对象包装一个原始指针 并负责其生命周期 当该对象被销毁时 会在其析构函数中删除关联的原始指针 u
  • spwan-fcgi和fcgi 关系

    spwan fcgi 举个例子 spawn fcgi a 127 0 0 1 p 10000 f login spwan fcgi c main 函数 会执行参数解析过程 获得 ip 端口 和 执行文件的路径 bind socket 函数会
  • Ubuntu22 k8s 1.27.1 安装及集群搭建教学(2023.5.16 k8s 最新版本教学,只看这一篇就够了哦!保姆级教程!不行你来找我!)

    Ubuntu22 k8s 1 27 1 安装及集群搭建教学 2023 5 16 k8s 最新版 只看这一篇就够了哦 保姆级教程 不行你来找我 温馨提示请仔细阅读 1 由于新版的k8s不支持docker了 因此开始前建议新开一台全新的虚拟机
  • Java finally return执行顺序

    Java finally语句到底是在return之前还是之后执行
  • vuex详解一:彻底弄懂state、mapState、mapGetters、mapMutations、mapActions

    一 state 先看一下标准的store目录结构 入vuex 以后 我们需要在state中定义变量 类似于vue中的data 通过state来存放共享的1状态 store actions mutations getters mutation
  • 免费虚拟机软件VirtualBox快速入门

    文章目录 目的 快速入门 下载与安装 新建虚拟机 启动虚拟机 修改分辨率 使用USB设备 常用设置 显示菜单 共享粘贴板和文件拖放 性能调整 网络调整 共享文件夹 快照 导出导入 总结 目的 虚拟机 Virtual Machine 指通过软
  • 睿智的目标检测58——Pytorch Focal loss详解与在YoloV4当中的实现

    睿智的目标检测58 Pytorch Focal loss详解与在YoloV4当中的实现 学习前言 什么是Focal Loss 一 控制正负样本的权重 二 控制容易分类和难分类样本的权重 三 两种权重控制方法合并 实现方式 学习前言 给Yol
  • 热数据、温数据、冷数据

    1 定义 热数据 温数据和冷数据是指根据数据的访问频率和重要性 将数据分为不同的类别 以便更好地管理和存储数据 热数据 Hot Data 指访问频率高 对业务和应用关键的数据 这些数据通常需要快速 高效地访问和处理 因此需要存储在高性能 低
  • java按单个或多个标点符号分割字符串,筛选单词

    一 对于功能需求比价简单的字符串 例如只需要按单个标点分割的字符串 可以使用split 方法来分割 例如 String s1 Hellow World String s1 Hello World String s2 s1 split for
  • Xilinx ISE、iMPACT、PlanAhead在Windows 10 64位系统下闪退的解决办法

    文章目录 现象描述 一 ISE 10 1安装程序崩溃 二 无法加载License 三 ISE 14 7和iMPACT闪退 四 PlanAhead 14 7闪退 问题分析 解决办法 一 ISE 10 1安装程序闪退的解决办法 二 无法加载Li
  • vue-mixins一些常用方法

    前言 今天接手公司的一个vue的项目 发现项目中有个mixins属性 我发现之前的项目中都没有发现过这个属性 查阅了官方文档并进行了总结 官方文档 mixins vue mixins与父子组件还是有很大的区别的 组件与mixins区别 组件
  • mongodb命令

    1 Help查看命令提示 help db help db yourColl help db youColl find help rs help 2 切换 创建数据库 use yourDB 当创建一个集合 table 的时候会自动创建当前数据
  • android webview 显示灰度网页

    要在WebView中显示网页灰度显示 您可以通过以下步骤操作 使用的原理两种方式 一种使用画笔 一种是js css注入 都能够实现黑白色灰度网页 在您的布局文件中添加WebView组件
  • 《重构:改善既有代码的设计》读书笔记(持续更新中)

    背景 我也不知道这个算不算读书笔记 书本知识点整理和个人理解内容可跳至下面正文 最近过年加找工作一直没想起来整理学习内容 时间都很零碎 回想一下 的确一直以来都是为了完成项目去看知识点 除了刚开始想转行做IT的时候跟着慕课网的两条前后端路线
  • ARP协议详解,ARP协议执行原理、ARP协议如何根据IP地址寻找Mac地址?

    作者主页 士别三日wyx 作者简介 CSDN top200 阿里云博客专家 华为云享专家 网络安全领域优质创作者 ARP协议 一 什么是ARP协议 1 Mac地址 2 网络层的数据 3 ARP协议 二 ARP协议执行原理 1 局域网内 2
  • Java设计模式——命令模式

    文章目录 命令模式 命令模式 命令模式很好理解 举个例子 司令员下令让士兵去干件事情 从整个事情的角度来考虑 司令员的作用是 发出口令 口令经过传递 传到了士兵耳朵里 士兵去执行 这个过程好在 三者相互解耦 任何一方都不用去依赖其他人 只需