第14章

  1. 行为型模式描述了一种通过特定方法,在不同对象之间通信来解决常见问题的方式。
  2. 模板方法模式是,实现具有固定框架(或整体控制流程),但允许有一个或多个定制点,以应对特定问题的算法的标准方式。
  3. 模板方法模式允许子类(派生类型)实现通用算法中的特定行为。该模式的关键在于基类与派生类之间的交互方式。
  4. 更常见的分层设计方法中,底层代码提供构建模块,高层代码通过特定的控制流程,将这些模块组合起来形成具体算法。而在模板方法模式中,高层代码并不决定整体算法,也不控制整体流程。相反,底层代码控制算法,并决定何时调用高层代码,来调整执行过程中的特定方面。
  5. 这是一种模式,类型层次结构的公共接口由基类的非虚公共方法实现,而派生类仅包含虚拟的私有方法(以及实现这些方法所需的数据和非虚方法)。
  6. 一个公共的虚函数执行两个独立的任务 —— 提供接口(因为它是公共的)并修改实现。更好的关注点分离是仅使用虚函数来自定义实现,而使用基类的非虚函数来定义公共接口。
  7. 当采用非虚接口(NVI)模式,虚函数通常可以设为私有。一个例外是当派生类需要调用基类的虚函数以委派部分实现时。这种情况下,该函数应设为受保护。
  8. 析构函数以嵌套顺序调用,从最派生的类开始。当派生类的析构函数执行完毕后,会调用基类的析构函数。此时,派生类所包含的信息已销毁,仅剩基类部分。如果基类的析构函数调用虚函数,则该调用必须分派到基类本身(因为派生类此时已不存在)。基类析构函数无法调用派生类的虚函数。
  9. 脆弱基类问题表现为,对基类的更改无意中破坏了派生类。虽然该问题并非模板方法模式特有,但它可能影响所有面向对象设计,包括基于模板模式的设计。最简单的例子是,如果以改变用于定制算法行为虚函数名称的方式,修改基类的非虚公共函数,就会破坏所有的派生类,因为它们通过旧名称的虚函数实现的定制会突然失效。为避免此问题,不应更改现有的定制点。