《Java设计模式及实践》—1.5.3 里氏替换原则
1.5.3 里氏替换原则
Barbara Liskov指出,派生类型必须完全可替代其基类型。里氏替换原则(LSP)与子类型多态密切相关。基于面向对象语言中的子类型多态,派生对象可以用其父类型替换。例如,如果有一个Car对象,它可以在代码中用作Vehicle。
里氏替换原则声明,在设计模块和类时,必须确保派生类型从行为的角度来看是可替代的。当派生类型被其父类型替换时,其余代码就像它是子类型那样使用它。从这个角度来看,派生类型应该像其父类型那样表现,不应该破坏它的行为。这称为强行为子类型。
为了理解LSP,我们举一个违反原则的例子。在开发汽车服务软件时,我们发现需要对以下场景进行建模。当留下汽车需要服务时,车主离开汽车。服务助理拿走钥匙,当车主离开时,服务助理检查他是否有正确的钥匙以及是否发现了正确的车。他只是去解锁并锁上车,然后将钥匙放在指定的地方并留一张便条,这样机械师就可以在检查汽车时轻易找到钥匙。
我们已经定义了一个Car类,现在创建一个Key类并在汽车类中添加两个方法:lock和unlock。我们添加了一个相应的方法,助理检查钥匙是否匹配汽车:
类图如图1-12所示。
在开发软件时,我们想到了有时通过汽车服务修理巴吉赛车(译者注:一种没有门的沙漠赛车,使用后轮驱动)。由于巴吉赛车是四轮车,我们创造了一个继承自Car的Buggy类。如图1-13所示。
图 1-12 图 1-13
巴吉赛车没有门,因此无法锁定或解锁。我们相应地实现了代码:
我们设计的软件要用于汽车,无论它们是否是巴吉赛车,所以将来可以将它扩展到其他类型的汽车。汽车能被锁定或解锁可能会产生一些问题。
- 点赞
- 收藏
- 关注作者
评论(0)