软件实体(类,模块,函数等)应该是可扩展的,但是不可修改
优点:通过扩展已有软件系统,可以提供新的行为,以满足对软件的新的需求,使变化中的软件有一定的适应性和灵活性。已有软件模块,特别是最重要的抽象层模块不能再修改,这使变化中的软件系统有一定的稳定性和延续性。
下边举一个从不符合ocp到符合ocp的例子,shap示例在很多书中提到,我们这里用它来阐明ocp。不符合ocp的代码如下:




















































































































以上代码的问题是当增加新的图形时DrawAll函数要做比较大的修改工作,这很容易影响原本可以正常工作的部分,因为增加图形的变化可能性非常大,而且实际上当从画一种图形到画两种图形时我们已经发现了问题,我们不能再错过改成错误的机会,我们要对以上源代码进行大规模的重构。

















































































































以上代码在增加新的图形的时候只需实现Ishap接口,根本就不需要修改DrawAllShap函数,这样DrawAllShap函数就符合了ocp。
当画图时需要按某种顺序时,这种设计就没办法符合ocp原则了,如下更改是在需要顺序支持德尔符合ocp设计的代码(表格法)









































调用程序:





















