一、开-闭原则的定义:一个软件实体应当对扩展开放、对修改关闭,即一个软件应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化的。
二、开-闭原则的地位:开-闭原则是面向对象的可复用设计的基石,其他设计原则(里氏代换原则、依赖倒转原则、合成/复用原则、迪米特法则、接口隔离原则)都是实现开-闭原则的手段和工具。
当然以上都是一些官话,这里说一下自己浅显的理解就是,“开闭原则就是在应用层和具体层中间添加一层抽象层”。这个理解对某些情况是不太对的。
下面是体现开-闭原则的例子:
那天上讨论开-闭原则的课时,有个同学说接口不能定义属性,疑惑从来没听说过,后来上网查了一下,这个说法并不准确。Java的接口是可以定义属性的,但接口里的属性等同于常量,只能读不能写,因为有两点,一是接口里定义属性默时认的修饰词是public static final,二是因为有final修饰词修饰,所以在定义的时候必须初始化。
相反,接口里面不能定义变量。接口的这个特点就很好的体现了开-闭原则。看下面的代码:
public abstract class AbstractClass
{
public static int a;
}
public class Abstract1 extends AbstractClass
{
public static void main(String[] args)
{
AbstractClass.a++;
System.out.println(AbstractClass.a);
}
}
Abstarct1类的主方法最终输出的结果是1。
从中可以看出,抽象类的子类可以通过AbstractClass.a++改变父类的属性。如果接口也可以这样,那么接口和抽象类没什么区别。
所以接口对属性修改的关闭,对属性和方法的扩展开放,本身就是对开-闭原则的一种体现。所以会变化的东西不应该放在接口中,而是应该放在具体实现中。