我们要让代码同时满足对扩展开放、对修改关闭这两个属性。对扩展开放表示代码的行为可以扩展。对修改关闭表示当对代码的行为进行扩展时,其他代码完全不会受到影响。
代码如果同时满足这两个属性,就可以在不影响既有代码的前提下扩展功能。不论什么软件,只要它还在生命周期内,就一定会发生变化。而且软件的寿命远比我们想象的要长。因此,我们设计出的软件要既能适应变化,又能保持长期的稳定。
这就要求代码能够灵活应对变化,对扩展开放,对修改关闭。如果能够满足上述要求,就算需求发生变化,我们只要给代码添加新的行为,就能毫无风险地完成对软件的修改。如果设计得太过死板,那么一个小小的修改也会影响到所有与其存在依赖关系的部分。
死板的设计是非常脆弱的。我们要给代码添加接口。在设计具有某项功能的模块时,如果让模块的使用者客户端直接调用模块的提供者服务器,我们就可以说这个设计是死板的,因为在这种情况下如果想使用其他服务器,还需修改客户端。
因此,我们要在客户端与服务器之间为模块的使用者设置客户端接口。这个客户端接口由服务器实现。这样一来,在添加拥有新功能的服务器时,只要该服务器上有客户端接口,客户端就可以直接调用新服务器,我们就不用再修改代码了。也就是说,我们可以在不修改当前代码的前提下添加新功能。