设计模式之美
王争
前Google工程师,《数据结构与算法之美》专栏作者
立即订阅
21914 人已学习
课程目录
已更新 76 讲 / 共 102 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 (1讲)
开篇词 | 一对一的设计与编码集训,让你告别没有成长的烂代码!
免费
设计模式学习导读 (3讲)
01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?
02 | 从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力?
03 | 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
设计原则与思想:面向对象 (11讲)
04 | 理论一:当谈论面向对象的时候,我们到底在谈论什么?
05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?
06 | 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗?
07 | 理论四:哪些代码设计看似是面向对象,实际是面向过程的?
08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?
09 | 理论六:为什么基于接口而非实现编程?有必要为每个类都定义接口吗?
10 | 理论七:为何说要多用组合少用继承?如何决定该用组合还是继承?
11 | 实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?
12 | 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?
13 | 实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?
14 | 实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?
设计原则与思想:设计原则 (12讲)
15 | 理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?
16 | 理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
17 | 理论三:里式替换(LSP)跟多态有何区别?哪些代码违背了LSP?
18 | 理论四:接口隔离原则有哪三种应用?原则中的“接口”该如何理解?
19 | 理论五:控制反转、依赖反转、依赖注入,这三者有何区别和联系?
20 | 理论六:我为何说KISS、YAGNI原则看似简单,却经常被用错?
21 | 理论七:重复的代码就一定违背DRY吗?如何提高代码的复用性?
22 | 理论八:如何用迪米特法则(LOD)实现“高内聚、松耦合”?
23 | 实战一(上):针对业务系统的开发,如何做需求分析和设计?
24 | 实战一(下):如何实现一个遵从设计原则的积分兑换系统?
25 | 实战二(上):针对非业务的通用框架开发,如何做需求分析和设计?
26 | 实战二(下):如何实现一个支持各种统计规则的性能计数器?
设计原则与思想:规范与重构 (11讲)
27 | 理论一:什么情况下要重构?到底重构什么?又该如何重构?
28 | 理论二:为了保证重构不出错,有哪些非常能落地的技术手段?
29 | 理论三:什么是代码的可测试性?如何写出可测试性好的代码?
30 | 理论四:如何通过封装、抽象、模块化、中间层等解耦代码?
31 | 理论五:让你最快速地改善代码质量的20条编程规范(上)
32 | 理论五:让你最快速地改善代码质量的20条编程规范(中)
33 | 理论五:让你最快速地改善代码质量的20条编程规范(下)
34 | 实战一(上):通过一段ID生成器代码,学习如何发现代码质量问题
35 | 实战一(下):手把手带你将ID生成器代码从“能用”重构为“好用”
36 | 实战二(上):程序出错该返回啥?NULL、异常、错误码、空对象?
37 | 实战二(下):重构ID生成器项目中各函数的异常处理代码
设计原则与思想:总结课 (3讲)
38 | 总结回顾面向对象、设计原则、编程规范、重构技巧等知识点
免费
39 | 运用学过的设计原则和思想完善之前讲的性能计数器项目(上)
40 | 运用学过的设计原则和思想完善之前讲的性能计数器项目(下)
设计模式与范式:创建型 (7讲)
41 | 单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?
42 | 单例模式(中):我为什么不推荐使用单例模式?又有何替代方案?
43 | 单例模式(下):如何设计实现一个集群环境下的分布式单例模式?
44 | 工厂模式(上):我为什么说没事不要随便用工厂模式创建对象?
45 | 工厂模式(下):如何设计实现一个Dependency Injection框架?
46 | 建造者模式:详解构造函数、set方法、建造者模式三种对象创建方式
47 | 原型模式:如何最快速地clone一个HashMap散列表?
设计模式与范式:结构型 (8讲)
48 | 代理模式:代理在RPC、缓存、监控等场景中的应用
49 | 桥接模式:如何实现支持不同类型和渠道的消息推送系统?
50 | 装饰器模式:通过剖析Java IO类库源码学习装饰器模式
51 | 适配器模式:代理、适配器、桥接、装饰,这四个模式有何区别?
52 | 门面模式:如何设计合理的接口粒度以兼顾接口的易用性和通用性?
53 | 组合模式:如何设计实现支持递归遍历的文件系统目录树结构?
54 | 享元模式(上):如何利用享元模式优化文本编辑器的内存占用?
55 | 享元模式(下):剖析享元模式在Java Integer、String中的应用
设计模式与范式:行为型 (17讲)
56 | 观察者模式(上):详解各种应用场景下观察者模式的不同实现方式
57 | 观察者模式(下):如何实现一个异步非阻塞的EventBus框架?
58 | 模板模式(上):剖析模板模式在JDK、Servlet、JUnit等中的应用
59 | 模板模式(下):模板模式与Callback回调函数有何区别和联系?
60 | 策略模式(上):如何避免冗长的if-else/switch分支判断代码?
61 | 策略模式(下):如何实现一个支持给不同大小文件排序的小程序?
62 | 职责链模式(上):如何实现可灵活扩展算法的敏感信息过滤框架?
63 | 职责链模式(下):框架中常用的过滤器、拦截器是如何实现的?
64 | 状态模式:游戏、工作流引擎中常用的状态机是如何实现的?
65 | 迭代器模式(上):相比直接遍历集合数据,使用迭代器有哪些优势?
66 | 迭代器模式(中):遍历集合的同时,为什么不能增删集合元素?
67 | 迭代器模式(下):如何设计实现一个支持“快照”功能的iterator?
68 | 访问者模式(上):手把手带你还原访问者模式诞生的思维过程
69 | 访问者模式(下):为什么支持双分派的语言不需要访问者模式?
70 | 备忘录模式:对于大对象的备份和恢复,如何优化内存和时间的消耗?
71 | 命令模式:如何利用命令模式实现一个手游后端架构?
72 | 解释器模式:如何设计实现一个自定义接口告警规则功能?
不定期加餐 (3讲)
加餐一 | 用一篇文章带你了解专栏中用到的所有Java语法
加餐二 | 设计模式、重构、编程规范等相关书籍推荐
春节特别加餐 | 王争:如何学习《设计模式之美》专栏?
免费
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

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

王争 2020-04-15
设计模式模块已经接近尾声了,现在我们只剩下 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《设计模式之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(17)

  • qinsi
    GoF的设计模式脱胎于开发smalltalk的经验,而smalltalk的一大特点是自带图形界面,所以很多设计模式都是脱胎于解决图形界面的开发问题。命令模式在早期图形界面的编辑器中用于解决编辑历史的问题,比如在实现操作的同时还要实现一个反操作用来undo,而重放操作就可以redo。由于现代计算机的存储成本比设计模式刚出现那会低太多了,于是通过快照方式来实现编辑历史也变得可行了
    2020-04-15
    10
  • eason2017
    Hystix熔断框架就用到了命令模式。
    2020-04-15
    4
  • 大头
    观察者模式和用接口实现的职责链模式,从设计意图来看,观察者重在状态变化时通知所有的观察者,观察者之间是并列关系。职责链模式侧重顺序处理,处理类之间是串行关系
    2020-04-15
    3
  • 老师,我看不少讲策略模式的文章,喜欢用电商促销打折作为例子,但是我看每种打折方案是不能相互替换的,反倒适合命令模式或工厂
    2020-04-15
    1
    2
  • 小晏子
    再比较下命令模式和策略模式,策略模式的意图是封装算法,它认为“行为”是一个完整的、不可拆分的业务,即其意图是让这些行为独立,并且可以相互替换,让行为的变化独立于拥有行为的客户;而命令模式则是对动作的解耦,把一个动作的执行分为执行对象,执行行为,让两者相互独立而不相互影响。二者的关注点不同:策略模式提供多种行为由调用者自己选用,算法的自由选用是其关注点。命令模式关注解耦,将请求的内容封装成命令由接受者执行。二者使用场景不同,策略模式适用于有多种行为可以相互替换的场景;而命令模式适用于解耦两个紧耦合关系的对象或多命令对撤销的场景。
    2020-04-15
    2
  • shniu
    感觉redis就是使用了命令模式来处理指令的
    2020-04-15
    2
  • 黄林晴
    打卡 结束后 开启重刷
    第一遍 了解定义
    第二遍代码实现
    第三遍 实际应用
    2020-04-15
    1
  • Ken张云忠
    代理模式与装饰器模式代码差不多,代理模式是业务非功能性的增强,装饰器模式是对业务功能性的增强。
    2020-04-15
    1
  • 辣么大
    代理模式和装饰器模式:区别代理模式可以控制对象访问,装饰器模式给对象增加功能,二者的使用场景不同。
    2020-04-17
  • 唔多志
    敲黑板:设计模式之间的主要区别还是在于设计意图,也就是应用场景。是的,在代码层面,无非就是继承、组合、多态;但每一种模式最初的目的是不一样的,想要解决的问题也是不一样的。
    2020-04-17
  • Hubbert伟涛
    代理模式跟模板模式。虽然一个是结构型,一个是行为型,但是感觉他们有点相同之处。
    代理模式是在不改变原有类的基础上,对原有类进行功能的扩展,可以使附加功能与非业务逻辑解耦,更加关注业务逻辑。
    模板模式也是有两大作用,那就是复用和扩展。跟代理模式一样有个扩展功能。但却不是代码的扩展性,是指框架的扩展性。就例如测试框架,让框架用户可以在这些扩展点上扩展功能。
    它们的相同之处是可扩展,不相同之处是一个方便代码的扩展,一个方便框架的扩展。
    2020-04-15
  • 大橙子
    类与类之间通信:使用命令对象(包含数据与行为)。解耦:请求转换成命命令,命令调度,命令执行
    2020-04-15
  • 单例模式和享元模式,缓存,静态工厂方法:
    他们的共同点是:对象的复用
    不同点:
    应用享元模式是为了对象"共享使用",节省内存
    而应用单例/多例模式是为了限制对象的个数
    应用缓存是为了提高访问效率
    应用对象池(数据库连接池,线程池)是为了对象的"重复使用"和管理,主要是为了节省时间
    有一种方法叫 静态工厂方法,例如 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
  • Heaven
    装饰器模式和适配器模式在组合的实现时候就很相似,但是装饰器模式是为了增强原有类的功能而适配器模式虽然也是修改原有类,但是是为了补救原有的缺陷的
    2020-04-15
  • 守拙
    课堂讨论:
    观察者模式(Observer Pattern)与职责链模式(Chain Of Responsibility Pattern)的实现方式是类似的:

    在Observer Pattern中, Observable注册多个Observer, Observable发送事件时遍历所有Observer执行操作.

    在COR Pattern中, Chain添加多个Responsibility Object, 事件触发时Chain遍历所有Responsibility Ojbect执行操作.

    虽然UML类图和代码实现上两者十分相似, 不同之处在于Observer Pattern专注Observable与Observer的解耦, COR Pattern关注当事件触发时, 事件沿着链条传递, 链条上的对象顺序处理事件, 或拦截事件.

    2020-04-15
  • Jeff.Smile
    “整个手游后端服务器轮询获取客户端发来的请求,获取到请求之后,借助命令模式,把请求包含的数据和处理逻辑封装为命令对象,并存储在内存队列中。然后,再从队列中取出一定数量的命令来执行。”
    ————————————————————
    感觉不需要放入队列呢,直接执行命令对象呢?取出一定数量,指的是线程池里批处理吗?
    2020-04-15
    3
  • 马以
    设计模式接近尾声,坐等顶级互联网编程经验
    2020-04-15
收起评论
17
返回
顶部