Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式之命令模式

设计模式之命令模式

作者头像
Dylan Liu
发布于 2019-12-19 11:06:27
发布于 2019-12-19 11:06:27
33300
代码可运行
举报
文章被收录于专栏:dylanliudylanliu
运行总次数:0
代码可运行

简介

命令模式(Command Pattern)属于设计模式中的行为型模式。命令模式实现了施令者与具体命令的解耦,并且可以实现撤销等命令相关功能。

定义

命令模式(Command Pattern):将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。

命令模式的核心是命令,何为命令?其实命令在日常用于中叫请求,调用一个类的方法,其实就是给类发一个命令让它去执行这个方法,命令模式就是将原本的函数调用封装到类中,由方法级别提升到类级别,从而实现请求者与执行者的解耦,并且可以提供更多的功能,譬如撤销,记录日志等。

角色

命令模式的角色有抽象命令角色,具体命令角色,命令接收者角色及命令调用者角色。

抽象命令:定义命令的通用接口,用于提供给调用者统一的调用API 具体命令:实现具体的命令执行逻辑 命令接收者:真正的逻辑实现地方,(命令提供给调用方一个统一界面,真正逻辑并不在命令里实现,如果没有命令接收者,具体命令就需要充当命令接收者的角色) 调用者:请求的发起方

其实应该还有一个协调者角色,它负责初始化具体的命令,设置到调用者中,不过这个一般在main 函数中实现,不列到此处。

模式说明

既然是将对象请求封装为命令,那么所有的代码其实都可以封装成命令模式,区别只是有没有必要。在具体实践中,用户界面相关使用最多,因为命令模式支持的撤销、日志、记录等功能都特别符合用户需求。

在浏览器或手机APP 中,都会提供返回功能,用户只需要点击返回按钮就可以返回到上一层,对于开发人员来说,这个功能浏览器和手机都已经提供了,只需要调用一个 back 就可以。如果让我们来实现,就可以使用命令模式来将 back 映射到撤销功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
  * 在浏览器中是URL跳转
  * 在手机中是 Activity 跳转
  */
public interface Command<T> {
    void execute(T param);
    void back();
}

public class UrlCommand implements Command<String> {
    private WindowHanlder windowHandler;
    private Window preWindow;
    private UrlReceiver receiver;
    public UrlCommand(UrlReceiver rec) {
        this.receiver = rec;
        
    }
    public void execute(String url) {
        // 保存当前窗口
        this.preWindow = windowHandler.getWindow();
        rec.parseAndRend(url);
    }
    
    public void back() {
        // 将原窗口再设置回去
        windowHandler.setWindow(preWindow);
    }
}

/**
  * url 具体执行
  */
public class UrlReceiver {
    public void parseAndRend(String url) {
        // 获取url 对应内容
        String content = parse(url);
        // 渲染到窗口中
        rend(content);
    }
    
    private void rend(String content) {
        // 渲染窗口
    }
}

public class User {
    public static void main(String[] args) {
        // 在浏览器里用户点击 url
        String url = "";
        UrlCommand command = new UrlCommand(new UrlReceiver());
        command.execute(url);
        
        // 用户点击返回
        command.back();
    }
}

此处 Command 只能支持单个命令的执行撤销,我们可以写一个 宏命令来封装一串命令执行后的撤销功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MacroUrlCommand implements Command<String> {
    private Stack<Command> commands = new Stack<>();
    private UrlReceiver receiver;
    public MacroUrlCommand(UrlReceiver rec) {
        this.receiver = rec;
        
    } 
    public void execute(String url) {
        UrlCommand command = new UrlCommand(receiver);
        commands.push(command);
        command.execute(url);
    }
    
    public void back() {
        if(CollectionUtils.isEmpty(commands)) {
            return;
        }
        
        Command last = commands.pop();
        last.back();
    }
}

使用场景

  • 请求方与接收方解耦,请求方不需要知道接收方的细节,就像我们使用遥控器调节电视,不需要知道原理,只需要按一下按钮
  • 统一用户界面。开关电灯和开关电脑可以使用相同的用户界面,用户只需要按一下按钮就可以打开电灯或电脑,而不需要重新学习。命令模式通过抽象请求,来实现统一的命令界面
  • 有撤销等功能要求的时候。命令模式定义中就含有此类功能,如果用户要求支持撤销,命令模式是天然的选择
  • 需要支持 redo 和 undo。 数据库等软件在执行插入删除等命令前会将命令记录下来,以便系统崩溃时可以重建。也可以在执行命令后撤销对系统对修改

优点

  • 请求者与实现者解耦,两个可以独立变化
  • 命令可以结合起来变成组合命令(类似装饰模式)
  • 命令作为一个执行单元,支持 redo 和 undo(为避免命令过重,可以与备忘录模式结合)
  • 简单的批处理。可以对系统发一系列命令,系统顺序处理,降低通信成本

缺点

  • 具体命令很容易膨胀,导致系统越来越难以维护
  • 命令对原本直接调用加了一个间接层,增加了系统复杂度,使得理解系统更加困难

模式辨析

Callback 模式:告知某人操作已经完成,操作结果是什么

观察者模式:通知 n(n>=0) 个观察者某个事件发生

命令模式: 封装对对象的调用,使得命令有一个统一界面,相同命令可以相互转换

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
窗口置顶工具v2.4.0
很高兴能更新到2.4.0版本。 小君在coding时,有时候需要快捷置顶,但又不想移动鼠标到置顶栏操作,于是想到点击几次鼠标置顶的操作,偷偷懒,至于按压窗口空白处移动窗口,同样也是不想移动到标题栏点击移动,倒是点点鼠标移动就可以移动窗口了,多好啊。
Qt君
2023/03/17
6150
窗口置顶工具v2.4.0
发布窗口置顶工具1.0.0
  一个Windows平台的窗口置顶工具。目前添加了以下功能: 置顶窗口功能; 窗口穿透功能; 窗口透明度设置功能; 窗口自定义画中画功能。 演示 置顶 2. 鼠标穿透 透明度设置 画中画 拖动效果 访问以下链接: https://github.com/aeagean/WindowTop
Qt君
2023/03/17
7710
发布窗口置顶工具1.0.0
窗口置顶工具v1.2.0
访问以下链接: https://github.com/aeagean/WindowTop
Qt君
2023/03/17
4370
窗口置顶工具v1.2.0
窗口置顶工具v1.1.0
访问以下链接: https://github.com/aeagean/WindowTop
Qt君
2023/03/17
3580
窗口置顶工具v1.1.0
窗口置顶工具v2.7.0(GIF录制)
大家好,很高兴能再次更新版本。本次主要更新是GIF窗口录制的功能,该功能支持最高100帧/秒录制,高压缩比的同时尽可能保持高质量。
Qt君
2023/09/18
1790
窗口置顶工具v2.7.0(GIF录制)
电脑软件:SmartSystemMenu(窗口置顶工具)介绍
SmartSystemMenu 是一款简单实用的 Windows 窗口增强工具,它可以为窗口的标题栏右键菜单新增 17 个新功能。
小明互联网技术分享社区
2023/11/21
7340
电脑软件:SmartSystemMenu(窗口置顶工具)介绍
窗口置顶工具v1.3.0
访问以下链接: https://github.com/aeagean/WindowTop
Qt君
2023/03/17
4410
窗口置顶工具v1.3.0
Camtasia2023最新版使用快捷键教程
使用Camtasia,您可以毫不费力地在计算机的显示器上录制专业的活动视频。除了录制视频外,Camtasia还允许您从外部源将高清视频导入到录制中。Camtasia的独特之处在于它可以创建包含可单击链接的交互式视频,以生成适用于教室或工作场所的动态视频内容。(Win10,Win11 兼容)最近发布了Camtasia2023版本,新增超过130个过滤效果,将标注、文本和其他元素组合在一起,轻松处理大型项目和视频文件。
用户7442547
2023/02/14
1.6K0
BetterDisplay Pro Mac(显示器管理工具)v1.4.7激活版
BetterDisplay Pro Mac版是一款屏幕显示优化工具,可以帮助用户调整屏幕的亮度、对比度、色彩等参数,以获得更好的视觉体验。此外,它还提供了一些额外的功能,如屏幕分割、窗口管理、快捷键设置等,帮助用户更高效地使用电脑。用户可以根据自己的需求进行屏幕参数调整和功能设置,以达到最佳效果。总的来说,BetterDisplay Pro是一款实用的屏幕优化工具,可以为用户带来更好的视觉体验和更高效的电脑使用方式。
小草莓
2023/03/29
1.9K1
BetterDisplay Pro Mac(显示器管理工具)v1.4.7激活版
iOS14功能更新详解,空间音频功能上线!
(VRPinea 9月23日讯)近期举办的苹果秋季新品发布会,也许是近年来最令人失望的苹果发布会,本次发布会不但没有公布新款iPhone12,发布会的内容也极少,只有寥寥几款产品推出。好在苹果还是宣布了一个令熬夜果粉稍稍欣慰的消息——iOS14正式推送。相比于之前的beta版本,iOS14正式版最亮眼的更新,就是实装了传闻中的空间音频技术。
VRPinea
2020/09/30
1.4K0
首个基于西瓜播放器的WordPress m3u8视频播放器插件wp xgplayer
前段时间不是写了基于videojs播放器的插件吗,然后看见有人说国内用DPlayer来搭配的比较多,我就找了下DPlayer,但是找的途中,才看见了西瓜播放器这款产品,是字节跳动旗下的开源产品。所以我就直接放弃DPlayer,改用西瓜播放器来试了下。
速企云
2024/04/21
9775
首个基于西瓜播放器的WordPress m3u8视频播放器插件wp xgplayer
Snpiaste截图软件使用
即上次整理了秀米编辑器使用后,曾老师提议其实可以做个效率工具合集,转念一想小洁老师在马拉松课程里面可是提到了不少提升效率的软件以及网页插件,小助教这就整理起来!
生信技能树
2024/04/26
2830
Snpiaste截图软件使用
那些防不胜防的坑儿
AirPlay:AirPlay 是指将iOS设备或者Mac设备上的音视频,同步到另一个设备中播放。比如:将iPhone上的音乐通过蓝牙的方式在汽车的蓝牙音响上播放。此功能一般用于多端及多屏的交互。 画中画的视频播放:画中画是 iPad 版本的iOS 9新增加的功能,可以在 iOS 的桌面,或者其他应用的界面的上面播放视频,从而该视频区域所属的应用就可以后台运行了。此功能现在只在 iPad 应用中提供。
用户5521279
2019/06/02
1.4K0
国产linux操作系统深度系统20.3发布(推荐)
深度操作系统(deepin)是一个致力于为全球用户提供美观易用、安全稳定服务的Linux发行版,同时也一直是排名最高的来自中国团队研发的Linux发行版。(了解deepin国际排名)
全栈程序员站长
2022/08/29
6K0
国产linux操作系统深度系统20.3发布(推荐)
会声会影2023专业版新功能讲解
多场景适用,会声会影2023适用于个人、商店或是企业,可满足vlog视频、影视混剪、游戏解说、电子相册制作、淘宝主图视频、企业宣传片、线上网课制作等需求!采用优质的效果、强大的工具、可定制的转场,以及新的 AR 动画贴纸和 GIF,制作引人瞩目的视频。通过数百种效果、即时项目模板、标题和转场,加上新的动画 AR 贴纸和 GIF 创建器,探索拖放式创意。下载末尾会声会影教程参考!会声会影2023(Corel VideoStudio Ultimate 2023)(亦称绘声绘影)是一款功能强大的视频编辑软件,入手非常简单,可以帮助用户制作优秀的视频内容,支持视频编辑和视频特效等,是一款普及度非常高的视频编辑软件。它是一款高效的视频剪辑处理软件。该软件在这个版本中增加了全新的AI智能小工具,不论是家庭还是工作中使用都非常的方便,甚至可以挑战专业级的影片,非常适合想要制作视频的人来使用。
用户7442547
2023/01/03
1.5K0
Slidepad for Mac(高效率办公软件)v1.3.9激活版
Slidepad Mac版是Mac平台上的一款高效率办公软件,Slidepad for Mac下载可以在你的Mac电脑上设置一个侧边窗口,类似于iPad的功能,在那里你可以放置你最喜欢的网络应用程序和网站。
小草莓
2022/10/29
4760
Slidepad for Mac(高效率办公软件)v1.3.9激活版
Snipaste:高效便捷的截图工具,提升工作效率的利器
Snipaste 是一个简单但强大的截图工具,可以让截图贴回到屏幕上!下载并打开 Snipaste,按下 F1 来开始截图,再按 F3,截图就在桌面置顶显示了。
M.Talen
2024/05/22
2530
Snipaste:高效便捷的截图工具,提升工作效率的利器
Slidepad:iPad式APP切换工具
Slidepad Mac版是一款强大的iPad式APP切换工具,可以在macos上面发挥iPad即用即走的特点,让网页或者应用就像磁贴一样在侧边栏进行固定,在你需要的时候只需要轻触即可,让你使用起来更加的方便!
啾咪啾咪
2022/10/12
9500
Android Oreo 常见问题 2.0 | Android 开发者 FAQ Vol.9
在第一期 Android Oreo 8.0 开发者 FAQ 中,我们为了尽快让大家快速了解 Android Oreo 的新特性,以及它与之前版本 Android 的区别,我们针对 Android Oreo 发布后收到的大量留言咨询与重要新版本特性所留下了许多有代表性的问题逐个进行了解答。 然而对于 Android Oreo 这样一个全新的重大版本,寥寥几个问题无法代表全部开发者和用户。 近期,随着各个型号的手机陆陆续续升级到 Android Oreo,我们收到了更多的关于 Android Oreo 的留言
Android 开发者
2018/05/31
2K0
腾讯云音视频播放器又上新啦!短视频秒开组件、加密画中画等功能让音视频播放更专业!
根据腾讯云音视频官方的消息显示,播放器SDK是音视频终端SDK的子产品之一,它采用“腾讯视频”同款播放内核,经过内部业务长期优化和海量服务验证,对比系统播放器性能可提升20%-50%,同时具备“臻彩视听”、精准Seek、画中画等丰富功能,为用户提供直播、点播场景下流畅稳定的音视频播放能力,覆盖泛娱乐、电商、教育等多样化音视频业务场景,支持Web/H5、iOS、Android、Flutter平台。
三掌柜
2023/12/29
9324
腾讯云音视频播放器又上新啦!短视频秒开组件、加密画中画等功能让音视频播放更专业!
推荐阅读
相关推荐
窗口置顶工具v2.4.0
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验