《Head First 设计模式》笔记6

命令模式(Command)

将“请求”封装成对象,以便使用不同的请求,队列或日志来参数化其他对象。命令模式也支持可撤销的操作。

栗子

现在有个万能遥控器,它有五个插槽和五对开关按钮。每个插槽可以插一张存储卡,存储卡里面存的是可以控制的某个电器代码,对应的开关按钮可以控制某个电器开关。(听起来这个遥控器有点奇怪是不是?你把它想像成小霸王游戏机就可以了)

万能遥控器

你的任务就是给遥控器上的这些开关按钮编程,让它们可以使用存储卡存的电器命令进而控制电器。

Read more

《Head First 设计模式》笔记4

工厂模式(Factory)

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

new

按照之前的原则,使用接口,并 new 一个具体实现:

1
Duck duck = new MallardDuck();

但如果出现一堆相关的具体类时,可能会写出这样的代码:

1
2
3
4
5
6
7
8
9
Duck duck;

if (picnic) { // 在野外,是绿头鸭
duck = new MallardDuck();
} else if (hunting) { // 在打猎,是诱导鸭
duck = new DecoyDuck();
} else if (inBathTub) { // 在浴缸,是橡皮鸭
duck = new RubberDuck();
}

一旦有变化或扩展,就要重新打开这段代码进行检查和修改。通常这样修改过的代码将造成部分系统更难维护和更新,而且也更容易犯错。

Read more

《Head First 设计模式》笔记3

装饰者模式(Decorate)

动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

设计原则四:类应该对扩展开放,对修改关闭。

如果使用过 Python,应该听过装饰器,虽然概念有点不同,但都是通过动态添加的方式给对象扩展功能。

Read more

《Head First 设计模式》笔记2

观察者模式(Observer)

定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

初识

我们先来了解一下报纸和杂志的订阅是怎么回事:

  1. 报社的业务就是出版报纸、杂志等各种出版物。
  2. 如果我想看报社的 A 报纸和 B 杂志,那么就向报社订阅 A 报纸和 B 杂志。
  3. 当他们有新的 A 报纸或 B 杂志出版时,就会向你派送,只要你是他们的订户,你就会一直收到新报纸,新杂志。
  4. 如果你不想看 B 杂志了,取消订阅,他们就不会再送新的 B 杂志给你了。但不会影响你订阅的 A 报纸。
  5. 只要报社还在运营,就会一直有人向他们订阅或取消报纸等出版物。

在观察者模式中,出版者报社 = 主题(subject),而我们订阅者 = 观察者(observer)。

Read more

《Head First 设计模式》笔记1

前言

对白很有趣,业务情景营造地很有氛围,如果还不会设计模式的话是值得一读的。

本笔记当然不会有那些有趣的图片和氛围,内容也会尽量浓缩。

策略模式(Strategy)

定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

Read more

《Java 8 函数式编程》笔记1

前记

在图书馆找有关 Java 的书时发现了这本动物出版社的书,大一时就听过 lambda,匿名函数之类的了(虽然两者不同),一直没机会接触前者,鉴于前段时间写的程序有好多匿名函数,很是冗余,本着好奇以及打算重构的心,就借来这本书打算学习一遍 lambda。本笔记按照章节顺序从第 2 章开始。

纸质书读起来很有滋味,建议买来或借来品味一番。

随书的资料在作者的 github 中可以下载到。

本笔记代码也全部放在 github 中,建议搭配代码食用~

Read more

《Java 8 函数式编程》笔记3

类库

默认方法

Collection 接口中新增了 stream 方法,如果继承它的子类没有实现 stream 方法,就使用它的 stream 方法,这样的方法叫默认方法。

Iterable 接口中也新增了一个默认方法:forEach,允许用户使用 lambda 表达式作为循环体。

JDKforEach 的实现方法:

Read more