第四篇 行为模式

    本篇将介绍一些常用的行为模式,它们描述如何控制执行的流转以及对象之间如何交互。在行为模式中,我们把行为中变化的部分进行了封装。我们前面提到的模板方法模式就是行为模式的一种,它把算法进行了分解,子类封装了那些可变的步骤。

    在本篇,我们将继续为大家讲解三个常用的行为模式,带领大家一起领悟OOP给我们带来的好处,特别是封装带来的好处。

    第12章 策略(Strategy)模式

    本章我们将讨论策略模式和如何封装变化,主要包含如下内容。

    通过回家过年的场景介绍如何封装变化。

    介绍策略模式。

    引入优先使用合成而非继承(Favor Composition over Inheritance)。

    12.1 既要坐飞机又要坐大巴

    还记得我们第2章给出的回家过年的例子吗?我们使用模板方法模式解决了代码重复的问题,我们现在又有新的需求了,如果Jennifer先要坐飞机,然后坐大巴才能回到家,考虑使用模板方法模式解决这个问题,我们必须增加了一个新类PassengerByAirAndCoach,表示既要坐飞机又要坐大巴回家的这类人,那么,代码片段如下所示。

    figure_0182_0189

    让我们看看加粗的部分,不难发现,该死的代码重复又摆在我们面前了,在类PassengerByAir和类PassengerByCoach你会重复发现这些加粗的代码。这或许只是麻烦的开始,试想如果我们还需要实现坐火车再坐大巴回家的这类人,坐大巴再坐火车回家的这类人,坐大巴再坐大巴的人……,别再想下去了,重复的噩梦已经开始了。

    继承虽然解决了第2章提到的简单需求,避免了代码重复,但是对于现在的需求而言,它仍然带来了“代码重复”的臭味。