面向对象的原则、模式、语言及框架(四)
开-闭原则:
任何软件在其生命周期内都会发生变化,如果我们期望开发出来的系统不会在第一版之后就被抛弃,就必须面对需求的变化而保持相对稳定.开-闭原则(The open-close principle)为我们提供了指引.
那什么是开-闭原则呢?
软件实体(模块,类,方法等)应该是可以扩展的,但是不可修改的.
这句话说出了软件实体应该具备的两个特征:
1、对扩展式开放的(Open for extension)
当需求变化时,我们可以对模块进行扩展,使其具有满足新需求的新行为。
2、对于更改时封闭的(Closed modification)
对模块进行扩展时,不能修改已有的源代码或二进制代码。
这两个方面似乎是矛盾的,我们怎么才能无需对模块进行改动的情况下改变它的功能呢?
关键是抽象,我们可以把一组行为抽象出一个接口/抽象类,而任意一个可能的行为则表现为
可能的派生类。这个原则的直接结果产生了策略模式(Strategy pattern),策略模式定义了
一个算法的接口,而其派生类则定义了不同的实现。当我们需要新的策略时,我们只需要重新
实现这个接口即可,而其他部分只依赖于这个接口,不依赖具体的实现。
下面我们看看一个使用策略模式满足开闭原则的例子:
class DrawAllByShape implements DrawAll{ public void drawAll(List<Shape> shapes){ sortByShape(shapes); for(Shape shape : shapes){ shape.draw(); } }}