2022-02-20_星期日

消息队列高手课

要想使用网络框架的 API 来传输结构化的数据,必须得先实现结构化的数据与字节流之间的双向转换。这种将结构化数据转换成字节流的过程,我们称为序列化,反过来转换,就是反序列化

  • 序列化的用途除了用于在网络上传输数据以外,另外的一个重要用途是,将结构化数据保存在文件中

择序列化实现需要权衡的几个因素:

  1. 序列化后的数据最好是易于人类阅读的;
  2. 实现的复杂度是否足够低;
  3. 序列化和反序列化的速度越快越好;
  4. 序列化后的信息密度越大越好,也就是说,同样的一个结构化数据,序列化之后占用的存储空间越小越好

大多数情况下,易于阅读和信息密度是矛盾的,实现的复杂度和性能也是互相矛盾的。所以,我们需要根据所实现的业务,来选择合适的序列化实现。

后端技术面试 38 讲

开闭原则说:软件实体(模块、类、函数等等)应该对扩展是开放的,对修改是关闭的。

对修改是关闭的,意味着:

  • 当对软件实体进行扩展的时候,不需要改动当前的软件实体
  • 不需要修改代码
  • 对于已经完成的类文件不需要重新编辑
  • 对于已经编译打包好的模块,不需要再重新编译

当我们在代码中看到 else 或者 switch/case 关键字的时候,基本可以判断违反开闭原则了。

设计的优劣需要放入需求变更的场景中考察。当需求变更时发现当前设计的腐坏,就要及时进行重构,保持设计的强壮和代码的干净。

策略模式

策略模式是一种行为模式,多个策略实现同一个策略接口,编程的时候 client 程序依赖策略接口,运行期根据不同上下文向 client 程序传入不同的策略实现。

20220220211214.png

适配器模式

适配器模式是一种结构模式,用于将两个不匹配的接口适配起来,使其能够正常工作。

20220220211326.png

观察者模式

观察者模式是一种行为模式,解决一对多的对象依赖关系,将被观察者对象的行为通知到多个观察者,也就是监听者对象。

20220220211343.png

模板方法模式

所谓模板方法模式,就是在父类中用抽象方法定义计算的骨架和过程,而抽象方法的实现则留在子类中。

20220220211431.png

1
2
3
4
5
6
7
8
abstract void onPress();

public void press() {
     onPress();
     for (ButtonListener listener : listeners) {
         listener.buttonPressed();
     }
}

通过模板方法模式,每个子类可以定义自己在 press 执行时的状态操作,无需修改 Button 类,实现了开闭原则。


大部分的设计模式都是用来解决扩展的灵活性问题的。

开闭原则可以说是软件设计原则的原则,是软件设计的核心原则,其他的设计原则更偏向技术性,具有技术性的指导意义,而开闭原则是方向性的,在软件设计的过程中,应该时刻以开闭原则指导、审视自己的设计:当需求变更的时候,现在的设计能否不修改代码就可以实现功能的扩展?如果不是,那么就应该进一步使用其他的设计原则和设计模式去重新设计。

updatedupdated2022-03-092022-03-09