开放-关闭原则:
![]() |
thereareno
DumbQuestions
问: 对扩展开放,对修改关闭?听起来很矛盾。设计如何兼顾两者?
答: 这是一个很好的问题。乍听之下, 的确感到矛盾, 毕竟, 越难修改的事物, 就越难以扩展, 不是吗?
但是, 有一些聪明的OO 技巧, 允许系统在不修改代码的情况下, 进行功能扩展。想想观察者模式( 在第2章)…… 通过加入新的观察者, 我们可以在任何时候扩展Subject( 主题), 而且不需向主题中添加代码。以后, 你还会陆续看到更多的扩展行为的其他OO 设计技巧。
问: 好吧!我了解观察者(Observ -able), 但是该如何将某件东西设计成可以扩展,又禁止修改?
答: 许多模式是长期经验的实证, 可通过提供扩展的方法来保护代码免于被修改。在本章, 将看到使用装饰者模式的一个好例子, 完全遵循开放-关闭原则。
问: 我如何让设计的每个部分都遵循开放-关闭原则?
答: 通常, 你办不到。要让OO 设计同时具备开放性和关闭性, 又不修改现有的代码, 需要花费许多时间和努力。一般来说, 我们实在没有闲工夫把设计的每个部分都这么设计( 而且, 就算做得到, 也可能只是一种浪费) 。遵循开放-关闭原则, 通常会引入新的抽象层次, 增加代码的复杂度。你需要把注意力集中在设计中最有可能改变的地方, 然后应用开放-关闭原则。
问: 我怎么知道,哪些地方的改变是更重要呢?
答: 这牵涉到设计OO 系统的经验, 和对你工作领域的了解。多看一些其他的例子可以帮你学习如何辨别设计中的变化区。
虽然似乎有点矛盾, 但是的确有一些技术可以允许在不直接修改代码的情况下对其进行扩展。
在选择需要被扩展的代码部分时要小心。每个地方都采用开放-关闭原则, 是一种浪费, 也没必要, 还会导致代码变得复杂且难以理解。