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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式--命令模式
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成对象,以便可以将不同的请求参数化,队列化或记录日志,以及支持可撤销操作。在命令模式中,包含一个命令接口和具体的命令实现类,以及一个调用者(invoker)类和一个接收者(receiver)类。调用者通过调用接口中的方法执行命令,发起请求,接收者则负责实际执行命令。这种设计模式将调用者和接收者解耦,使得系统更加灵活。
软件架构师Michael
2023/07/18
2710
命令模式 Command 行为型 设计模式(十八)
BigDogMother作为客户端调用BigDog的回家吃饭方法,完成了“大狗子回家吃饭”这个请求
noteless
2018/12/25
5030
【地铁上的设计模式】--行为型模式:命令模式
命令模式(Command Pattern)是一种行为型设计模式,它将请求(命令)封装成一个对象,以便在不同的上下文中使用,并支持将操作可撤销和重做。该模式的核心思想是将命令的发出者(客户端)和接收者(执行命令的对象)解耦,从而实现请求的发送者和接收者之间的解耦。
喵叔
2023/05/09
3600
设计模式(十五):行为型之命令模式
冬天vs不冷
2025/01/21
980
设计模式(十五):行为型之命令模式
小谈设计模式(24)—命令模式
主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
学编程的小程
2023/10/11
1800
小谈设计模式(24)—命令模式
设计模式----命令模式
命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象
大忽悠爱学习
2021/11/15
4200
设计模式第四讲--命令模式
命令模式最初来源于图形化用户界面设计,但现在广泛应用于企业应用设计,特别促进了控制器(请求和分发处理)和领域模型(应用逻辑)的分离.说的更简单一点,命令模式有助于系统更好的进行组织,并易于拓展。
用户2825413
2019/07/16
2930
设计模式第四讲--命令模式
常用设计模式——命令模式
将"请求"封装成对象,以便使用不同的请求、队列、或者日志来参数化其他对象(就是命令对象拥有相同的接口,不同的命令对象可以被设置到调用者中)。命令模式也可以支持撤销操作。
用户5325874
2020/01/16
3640
常用设计模式——命令模式
「聊设计模式」之命令模式(Command)
🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!
bug菌
2023/11/13
4600
「聊设计模式」之命令模式(Command)
设计模式实战-命令模式
命令模式(Command Pattern)又称为行动(Action)模式或交易(Transaction)模式。
架构师修炼
2020/07/17
7600
设计模式学习笔记-命令模式
1. 概述   将一个请求封装为一个对象(即我们创建的Command对象),从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。 2. 解决的问题   在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。 3. 模式中角色   3.1 抽象命令(Command):定义命令的接口,声明执行的方法。   3.2 具体命令(ConcreteCommand):具体命令
用户1198337
2018/01/19
5160
设计模式学习笔记-命令模式
命令模式(Command Pattern)
命令模式(Command),將一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。——《设计模式:可复用面向对象软件的基础》
mingmingcome
2021/11/29
4920
命令模式(Command Pattern)
设计模式~命令模式
命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
Vincent-yuan
2020/09/03
4620
设计模式~命令模式
设计模式:命令模式
 今天说一下命令模式 命令模式 将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其它对象。命令模式也支持可撤销的操作。这样将“行为请求者”与“行为实现者”解耦, 实现松耦合 我们来看一个类图
lpxxn
2018/01/31
6050
设计模式:命令模式
java 命令模式[java泛型类继承]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说java 命令模式[java泛型类继承],希望能够帮助大家进步!!!
Java架构师必看
2022/03/09
3880
「设计模式 JavaScript 描述」命令模式
假设有一个快餐店,而我是该餐厅的点餐服务员,那么我一天的工作应该是这样的:当某位客人点餐或者打来订餐电话后,我会把他的需求都写在清单上,然后交给厨房,客人不用关心是哪些厨师帮他炒菜。我们餐厅还可以满足客人需要的定时服务,比如客人可能当前正在回家的路上,要求 1 个小时后才开始炒他的菜,只要订单还在,厨师就不会忘记。客人也可以很方便地打电话来撤销订单。另外如果有太多的客人点餐,厨房可以按照订单的顺序排队炒菜。
用户8921923
2022/10/24
3860
Java设计模式之命令模式 原
命令模式的最大的特点就是将请求的调用者与请求的最终执行者进行了解耦。调用者需要关心的仅仅是请求对象是否被执行了,对于请求对象是如何执行的,对什么进行操作的,统统不需要关心。
chinotan
2019/04/03
3780
Java设计模式之命令模式
                                                                            原
设计模式-命令模式
命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
码哥字节
2021/07/27
3770
Java设计模式(十八)----命令模式
命令模式 一、 概念 二、 结构 三、 具体案例 四、 宏命令 五、 命令模式优点 引子 在程序设计中,经常设计到一个对象需要请求另外一个对象调用其方法达到某种目的,如果请求这不希望或不直接和被请求者打交道,既请求者不包含被请求者的引 用,那么就可以使用命令模式。例如在军队中,指挥官请求三连偷袭敌人,但是指挥官不希望或无法直接与三连取得联系,那么可以将该请求形成一个命令,该命令 的核心是让三连偷袭敌人。只要能让该命令被执行,就会实现偷袭
汤高
2018/01/11
8470
Java设计模式(十八)----命令模式
【前端设计模式】之命令模式
命令设计模式是一种行为型设计模式,它允许你将命令封装到一个对象中,从而使你可以参数化不同的请求,以及存储、排队、重播和撤销请求。这种设计模式在处理用户界面操作、远程网络请求或其他需要异步执行的操作时非常有用。在前端开发中,我们经常需要处理复杂的操作和交互逻辑。命令模式允许我们将操作封装成对象,并将其作为参数传递、存储或记录,从而实现优雅地管理和执行操作。
can4hou6joeng4
2023/11/14
2580
相关推荐
设计模式--命令模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验