设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123426 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

71 | 命令模式:如何利用命令模式实现一个手游后端架构?

GameApplication类中的mainloop方法演示命令模式的应用
定义Command接口和具体命令类
存储命令、记录日志
撤销重做命令
异步、延迟、排队执行命令
控制命令的执行
对象可以存储下来,方便控制执行
将函数封装成对象
支持请求的排队执行、记录日志、撤销等功能
可以使用不同的请求参数化其他对象
将请求(命令)封装为一个对象
找两个代码实现或设计思路很相似的模式,说一说它们的不同点
命令模式的主要作用和应用场景
将函数封装成对象的核心实现手段
命令模式的设计意图和应用场景
命令模式中不同的命令具有不同的目的,对应不同的处理逻辑
策略模式侧重“策略”或“算法”这个特定的应用场景
区别在于设计意图和应用场景
示例代码
主要应用场景
命令模式的实现手段
命令模式的英文翻译是Command Design Pattern
课堂讨论
重点回顾
命令模式 VS 策略模式
命令模式的实战讲解
命令模式的原理解读
如何利用命令模式实现一个手游后端架构

该思维导图由 AI 生成,仅供参考

设计模式模块已经接近尾声了,现在我们只剩下 3 个模式还没有学习,它们分别是:命令模式、解释器模式、中介模式。这 3 个模式使用频率低、理解难度大,只在非常特定的应用场景下才会用到,所以,不是我们学习的重点,你只需要稍微了解,见了能认识就可以了。
今天呢,我们来学习其中的命令模式。在学习这个模式的过程中,你可能会遇到的最大的疑惑是,感觉命令模式没啥用,是一种过度设计,有更加简单的设计思路可以替代。所以,我今天讲解的重点是这个模式的设计意图,带你搞清楚到底什么情况下才真正需要使用它。
话不多说,让我们正式开始今天的学习吧!

命令模式的原理解读

命令模式的英文翻译是 Command Design Pattern。在 GoF 的《设计模式》一书中,它是这么定义的:
The command pattern encapsulates a request as an object, thereby letting us parameterize other objects with different requests, queue or log requests, and support undoable operations.
翻译成中文就是下面这样。为了帮助你理解,我对这个翻译稍微做了补充和解释,也一起放在了下面的括号中。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了如何利用命令模式实现手游后端架构,强调了命令模式的设计意图和实际应用。通过将请求封装为对象,命令模式能够参数化其他对象、排队或记录请求,并支持撤销操作。在手游后端服务器开发中,命令模式的应用能够避免多线程切换对性能的损耗,克服多线程编程难调试的缺点,是一种常见的架构模式。文章通过具体的例子和示例代码,结合游戏开发背景知识,详细讲解了命令模式的原理和实战应用。此外,文章还强调了设计模式之间的区别,特别是命令模式与策略模式的细微区别。读者通过本文学习,能够快速了解命令模式的设计意图和实际应用,以及在手游后端架构中的具体实现方式。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(53)

  • 最新
  • 精选
  • 一个慢慢爬行的普通人
    不知道老师会不会后面专栏进行functional programming和object oriented programming区别。尽管核心的编程思想和设计原理可能相近,但是还是希望老师能出一篇这样的专栏

    作者回复: 有的,后面有一篇讲函数式编程。

    2020-05-04
    2
  • 静心
    请教命令模式可以在进程间实现吗?按照本文的command定义,如果想要在进程间使用该模式,command对象的序列化怎么办?

    作者回复: 可以的。跟其他对象的序列化无差别,可以使用语言相关的,比如java本身自带的序列化方式,也可以使用语言无关的,比如protobuf,也可以自定义序列化方式

    2020-08-10
    1
  • J.Smile
    “整个手游后端服务器轮询获取客户端发来的请求,获取到请求之后,借助命令模式,把请求包含的数据和处理逻辑封装为命令对象,并存储在内存队列中。然后,再从队列中取出一定数量的命令来执行。” ———————————————————— 感觉不需要放入队列呢,直接执行命令对象呢?取出一定数量,指的是线程池里批处理吗?

    作者回复: 不,我这里是单线程处理的。你再仔细品品。

    2020-04-15
    7
    1
  • 单例模式和享元模式,缓存,静态工厂方法: 他们的共同点是:对象的复用 不同点: 应用享元模式是为了对象"共享使用",节省内存 而应用单例/多例模式是为了限制对象的个数 应用缓存是为了提高访问效率 应用对象池(数据库连接池,线程池)是为了对象的"重复使用"和管理,主要是为了节省时间 有一种方法叫 静态工厂方法,例如 Boolean.valueof(),不会在每次调用时返回一个新对象,而是复用已有的,这一点有点像享元模式 适配器,代理,装饰器,桥接,: 他们的共同点是:对方法的增强 不同点: 适配器模式的作用是"适配",通常用于适配不同的组件,新旧系统 桥接模式将接口部分和实现部分分离,使两者可以分别扩展 装饰者模式是对原始类功能进行增强,并且可以支持多次,多种增强 代理模式实现了代理类和原始类的解耦,使代理类可以用于增强不同的功能 策略模式与简单工厂模式,命令模式: 共同点:都有对if/else进行下沉 不同点: 策略模式根据运行时状态返回一个"策略"/"算法",这些"策略"具有相同目的,比如BubbleSort、SelectionSort 都是为了实现排序 命令模式中不同的命令具有不同的目的,对应不同的处理逻辑,并且互相之间不可替换 而简单工厂更侧重返回一个创建的对象 桥接模式与服务提供者框架,静态工厂的辨析(来自effective java): 服务提供者框架是这样一个系统: 多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把它们从多个实现中解耦出来 它分为四部分: 服务接口:系统抽象出一个接口,交给服务提供者实现(JDBC中的connection即为服务接口) 提供者注册API:交给服务提供者注册自己的API (Class.forName(),将自己的Driver类加载到JVM中,JDBC会查找该类并注册他的api) 服务访问API:是一个静态方法,供客户端获取服务实例(DriverManager.gtConnection()便是此处的静态工厂,它拿到的connection实例,其实是mysql包里的connection实现) 服务提供者接口:是服务接口实例的工厂对象(在此为mysql包内的Driver类) 在此处,桥接模式和静态工厂方法的使用,共同构成了服务提供者框架
    2020-04-15
    16
    242
  • qinsi
    GoF的设计模式脱胎于开发smalltalk的经验,而smalltalk的一大特点是自带图形界面,所以很多设计模式都是脱胎于解决图形界面的开发问题。命令模式在早期图形界面的编辑器中用于解决编辑历史的问题,比如在实现操作的同时还要实现一个反操作用来undo,而重放操作就可以redo。由于现代计算机的存储成本比设计模式刚出现那会低太多了,于是通过快照方式来实现编辑历史也变得可行了
    2020-04-15
    3
    84
  • eason2017
    Hystix熔断框架就用到了命令模式。
    2020-04-15
    41
  • 小晏子
    再比较下命令模式和策略模式,策略模式的意图是封装算法,它认为“行为”是一个完整的、不可拆分的业务,即其意图是让这些行为独立,并且可以相互替换,让行为的变化独立于拥有行为的客户;而命令模式则是对动作的解耦,把一个动作的执行分为执行对象,执行行为,让两者相互独立而不相互影响。二者的关注点不同:策略模式提供多种行为由调用者自己选用,算法的自由选用是其关注点。命令模式关注解耦,将请求的内容封装成命令由接受者执行。二者使用场景不同,策略模式适用于有多种行为可以相互替换的场景;而命令模式适用于解耦两个紧耦合关系的对象或多命令对撤销的场景。
    2020-04-15
    2
    15
  • 0xABC
    感觉redis就是使用了命令模式来处理指令的
    2020-04-15
    3
    14
  • 大头
    观察者模式和用接口实现的职责链模式,从设计意图来看,观察者重在状态变化时通知所有的观察者,观察者之间是并列关系。职责链模式侧重顺序处理,处理类之间是串行关系
    2020-04-15
    1
    14
  • 黄林晴
    打卡 结束后 开启重刷 第一遍 了解定义 第二遍代码实现 第三遍 实际应用
    2020-04-15
    11
收起评论
显示
设置
留言
53
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部