开放-封闭原则(OCP):
一、定义 :一个软件实体应当对扩展开放,对修改关闭。也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。
即对于扩展是开放的,对于修改是封闭的。当应用的需求改变时,可以对模块进行扩展,对模块行为扩展时,不是改动模块源代码或二进制代码。
二、开闭原则由Bertrand Meyer于1988年提出,它是面向对象设计中最重要的原则之一。在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
三、开闭原则还可以通过一个更加具体的“对可变性封装原则”来描述,对可变性封装原则(Principle of Encapsulation of Variation,EVP)要求找到系统的可变因素并将其封装起来。
四、开放-封闭原则的关键在于抽象。
1.抽象技术:abstract class、Interface
2.抽象预见了可能的所有扩展(闭)
3.由抽象可以随时导出新的类(开)
(补充:在第二条中,如果说抽象没有预见完整,可以使用动态代理技术等等,这里不再讨论)
五、实例:
假设一个实例,用手开关门。那么对此例进行设计:
代码如下
public class Door{
private boolean _isOpen = false;
public boolean isOpen(){
return _isOpen;
}
public void open(){
_isopen = true;
}
public void close(){
_isOpen = false;
}
}
public class Hand{
public Door door;
void do(){
if(door.isOpen())
door.close;
else
door.open();
}
}
public class SmartTest{
public static void main(String[] args){
Hand myHand = new Hand();
myHand.door = new Door();
myHand.do();
}
}
这样做是完全没有问题的,可是如果我不只是想开门还想开抽屉,开冰箱等等呢。
接下来,我们根据设计原则来进行修改(以增加开关抽屉为例):
这样修改后程序便具有了良好的可扩展性,即使再增加冰箱等等,也不用修改原来的代码
六、关于OCP:
1.OCP是OOD中很多说法的核心。如果这个原则应用的有效,应用程序就会具有更多的可维护性、可重用性以及可健壮性
2.LSP是OCP成为可能的主要原则之一。正是子类型的可替换性才使得使用基类类型的模块在无需修改的情况下就可以扩展。
七、总结:面对需求,对程序的改动是通过增加新代码进行的,而不是改变原来的代码。
如有错误,还请指出,非常感谢!!