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所示。
图12-2
有了上述结构,不管乘坐什么交通工具回家,乘坐多少次交通工具,我们都可以实现,而且没有了重复的代码。
我们看看HappyPeople的代码如何实现的。