五、开闭原则
类应该对扩展开放,对修改关闭。即不用修改原有程序的前提下新增一个类型。这是最重要的设计原则之一!
“开”是指对扩展“开放”,“闭”是指对修改“关闭”。其中那这个“扩展”包括“类型上的扩展”和“功能上的扩展”。比如“装饰者模式”这样能再添加责任,而不用修改原有的代码,属于功能上开放扩展;而“策略模式”,能再实现新的算法添加到算法族里,同样不用修改旧代码。这样的扩展属于类型上的扩展。
我们的目标是允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为。如能实现这样的目标,有什么好处呢?这样的设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求。
要遵循开闭原则,方法就是尽量遵循“多使用组合,少使用继承”:
利用组合(composition)和委托(delegation)可以在运行时具有继承行为的效果。
组合的强大威力:利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。
利用此技巧,可以把多个新职责,甚至是设计超类时还没有想到的职责加在对象上。而且,可以不用修改原来的代码。
通过动态组合对象,可以写新的代码添加新的功能,而无须修改现有代码。既然无须修改现有代码,那么引进bug或产生意外副作用的机会就将大幅度减少。
副作用:遵循开放-关闭原则,通常会引入新的抽象层次,增加代码的复杂度。你需要把注意力集中在设计中最有可能改变的地方,然后应用开放-关闭原则。
实例:“装饰者模式”就是一个完全遵循“开闭原则”的模式。
在选择需要被扩展的代码部分时要小心。每个地方都采用开放-关闭原则,是一种浪费,也没必要,还会导致代码变得复杂且难以理解。
评论
发表评论