12.4 还需要继承吗

    尽管之前我们抽象出了Travellable接口,但依然在使用继承,为了创建先坐大巴,然后再转大巴回家的这类人,我们还得创建一个新类,虽然避免了代码重复,但又引起了类的泛滥,既然策略模式可以在运行时交换算法,如果运行时决定他们的回家方式,那现在还需要HappyPeople的子类吗?

    既然这样,我们没必要使用静态方式创建这些不同回家方式的人,在运行时同样可以决定他们的回家行为。

    1.由于HappyPeople和Travellable之间是一对多的关系,我们为Happy People 添加了一个链表来持有Travellable对象,在运行时动态地把回家方式添加到这个链表就可以。

    2.方法travel()依次执行每个Travellable对象的travel()方法。

    3.最后,为了管理Travellable对象,我们还增加了addTransportation(Travellable transportation)、getTransportation(int index)等方法。

    4.于是,UML静态类图如图12-2所示。

    figure_0188_0196

    图12-2

    有了上述结构,不管乘坐什么交通工具回家,乘坐多少次交通工具,我们都可以实现,而且没有了重复的代码。

    我们看看HappyPeople的代码如何实现的。

    figure_0188_0197

    figure_0189_0198