《Head First 设计模式》笔记6
命令模式(Command)
将“请求”封装成对象,以便使用不同的请求,队列或日志来参数化其他对象。命令模式也支持可撤销的操作。
栗子
现在有个万能遥控器,它有五个插槽和五对开关按钮。每个插槽可以插一张存储卡,存储卡里面存的是可以控制的某个电器代码,对应的开关按钮可以控制某个电器开关。(听起来这个遥控器有点奇怪是不是?你把它想像成小霸王游戏机就可以了)
你的任务就是给遥控器上的这些开关按钮编程,让它们可以使用存储卡存的电器命令进而控制电器。
将“请求”封装成对象,以便使用不同的请求,队列或日志来参数化其他对象。命令模式也支持可撤销的操作。
现在有个万能遥控器,它有五个插槽和五对开关按钮。每个插槽可以插一张存储卡,存储卡里面存的是可以控制的某个电器代码,对应的开关按钮可以控制某个电器开关。(听起来这个遥控器有点奇怪是不是?你把它想像成小霸王游戏机就可以了)
你的任务就是给遥控器上的这些开关按钮编程,让它们可以使用存储卡存的电器命令进而控制电器。
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
按照之前的原则,使用接口,并 new 一个具体实现:
1 | Duck duck = new MallardDuck(); |
但如果出现一堆相关的具体类时,可能会写出这样的代码:
1 | Duck duck; |
一旦有变化或扩展,就要重新打开这段代码进行检查和修改。通常这样修改过的代码将造成部分系统更难维护和更新,而且也更容易犯错。
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
设计原则四:类应该对扩展开放,对修改关闭。
如果使用过 Python,应该听过装饰器,虽然概念有点不同,但都是通过动态添加的方式给对象扩展功能。
定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
我们先来了解一下报纸和杂志的订阅是怎么回事:
在观察者模式中,出版者报社 = 主题(subject),而我们订阅者 = 观察者(observer)。
对白很有趣,业务情景营造地很有氛围,如果还不会设计模式的话是值得一读的。
本笔记当然不会有那些有趣的图片和氛围,内容也会尽量浓缩。
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
在图书馆找有关 Java
的书时发现了这本动物出版社的书,大一时就听过 lambda
,匿名函数之类的了(虽然两者不同),一直没机会接触前者,鉴于前段时间写的程序有好多匿名函数,很是冗余,本着好奇以及打算重构的心,就借来这本书打算学习一遍 lambda
。本笔记按照章节顺序从第 2 章开始。
纸质书读起来很有滋味,建议买来或借来品味一番。
随书的资料在作者的 github 中可以下载到。
本笔记代码也全部放在 github 中,建议搭配代码食用~
使用 for
循环统计来自美国的艺术家:
1 | int count = 0; |
Collection
接口中新增了 stream
方法,如果继承它的子类没有实现 stream
方法,就使用它的 stream
方法,这样的方法叫默认方法。
Iterable
接口中也新增了一个默认方法:forEach
,允许用户使用 lambda
表达式作为循环体。
JDK
中 forEach
的实现方法: