在编写代码的过程中,无论是多么封闭的模块,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。必须事先猜测出最有可能发生变化的种类,然后构造抽象来隔离这些变化。
如果不使用开放—封闭原则,增加一个功能只是在client类中完成,那么后来再增加一个减法的算法,那我们只能修改原来的这个类,如果每次修改都需要重新写client算法类,这样就会给我们带来不必要的麻烦。如果我们在设计之初就考虑增加一个抽象的运算类,通过继承和多态的方法来隔离具体的加减、乘除方法,不仅可以满足我们的业务需要,还能在不改变client类的情况下增加功能,只需要增加相应的子类就可以了。
开放—封闭原则是面向对象的核心所在,软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。因此,开放封闭原则主要体现在两个方面:对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。但是并不能对应用程序中的每个部分都刻意抽象,应该拒绝不成熟的抽象。
依赖倒转原则
在编程时,我们的抽象类不应该依赖于细节,细节应该依赖于抽象。我们应该针对于接口编程,而不是针对于实现编程。这个意思可能是说,我们在实现功能的时候,功能可以随意的改变,如果我们只注重细节,在修改的时候就显得更麻烦。如果我们针对于接口编程,我们只需要改变我们的实现类,或者在子类中实现我们想要的功能,这样就提高了可维护性。
里氏代换原则
里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。只有当子类可以替换掉父类,软件单位的功能才能不受影响时,父类才能真正的被复用,而子类也能够在父类的基础上增加新的方法。
由于子类的可替换性,才使得父类模块在无需修改的情况下就可以拓展。