知识卡片
三种应对需求变化方案的取舍
内容
书店打折需求有三种方案:改接口(牵连所有实现类,违背契约稳定)被否定;直接改getPrice (其他调用方如采购人员会静默看到折后价,造成决策失误);新增OffNovelBook子类覆写 getPrice,完全不改动IBook和NovelBook,符合[[开闭原则的定义]],风险最小。发散:能否用 扩展替代修改,要看修改点是否被其他不该受影响的调用方共享。
参考来源
- 位置:《设计模式之禅(第2版)》第6章《开闭原则》(源文件:_epub-src/text/part0023.html)
- 结论依据:原文逐一分析修改接口、修改实现类、新增扩展子类三种方案的利弊,指出修改接口牵连所有实现类和契约稳定性、修改实现类会导致采购人员看到折后价造成决策失误,因此采纳新增OffNovelBook子类的扩展方案。
- 原始内容:修改NovelBook类中的方法,直接在getPrice()中实现打折处理……采购书籍人员也是要看价格的,由于该方法已经实现了打折处理价格,因此采购人员看到的也是打折后的价格,会因信息不对称而出现决策失误的情况……通过扩展实现变化……好办法,修改也少,风险也小。