定义:一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭. 意思是,在一个系统或者模块中,对于扩展是开放的,对于修改是关闭的,一个 好的系统是在不修改源代码的情况下,可以扩展你的功能. 而实现开闭原则的关键就是抽象化.
原则分析 :
1)当软件实体因需求要变化时, 尽量通过扩展已有软件实体,可以提供新的行为,以满足对软件的新的需求,而不是修改已有的代码,使变化中的软件有一定的适应性和灵活性 。已有软件模块,特别是最重要的抽象层模块不能再修改,这使变化中的软件系统有一定的稳定性和延续性。
2)实现开闭原则的关键就是抽象化 :在"开-闭"原则中,不允许修改的是抽象的类或者接口,允许扩展的是具体的实现类,抽象类和接口在"开-闭"原则中扮演着极其重要的角色..即要预知可能变化的需求.又预见所有可能已知的扩展..所以在这里"抽象化"是关键!
3)可变性的封闭原则:找到系统的可变因素,将它封装起来. 这是对"开-闭"原则最好的实现. 不要把你的可变因素放在多个类中,或者散落在程序的各个角落. 你应该将可变的因素,封套起来..并且切忌不要把所用的可变因素封套在一起. 最好的解决办法是,分块封套你的可变因素!避免超大类,超长类,超长方法的出现!!给你的程序增加艺术气息,将程序艺术化是我们的目标!
例子:我们前面提到的模板方法模式和观察者模式都是开闭原则的极好体现。
一、繁忙的银行业务员
二、轻松的银行业务员
三、开放封闭原则的优越性
1.通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,是变化中的软件有一定的适应性和灵活性。
2.已有的软件模块,特别是最重要的抽象模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。
没有实现OCP原则的例子:
BankWorker.java
/*
* 银行业务员
*/
public class BankWorker {
//负责存款业务
public void saving() {
System.out.println("进行存款操作");
}
//负责取款业务
public void drawing() {
System.out.println("进行取款操作");
}
//负责转账业务
public void zhuanzhang() {
System.out.println("进行转账操作");
}
//负责基金的申购
public void jijin() {
System.out.println("进行基金申购操作");
}
}
MainClass.java
public class MainClass {
public static void main(String[] args) {
BankWorker bankWorker = new BankWorker();
//存款
bankWorker.saving();
//取款
bankWorker.drawing();
//转账
bankWorker.zhuanzhang();
//基金
bankWorker.jijin();
}
}
实现了OCP原则的代码例子:
BankWorker.java
package com.ibeifeng.ex2;
/*
* 银行业务员接口,是所有银行业务员的抽象父类。
*/
public interface BankWorker {
public void operation();
}
SavingBankWorker.java
package com.ibeifeng.ex2;
/*
* 负责存款业务的业务员
*/
public class SavingBankWorker implements BankWorker {
public void operation() {
System.out.println("进行存款操作");
}
}
DrawingBankWorker.java
package com.ibeifeng.ex2;
/*
* 负责取款业务的业务员
*/
public class DrawingBankWorker implements BankWorker{
public void operation() {
System.out.println("进行取款操作");
}
}
ZhuanZhangBankWorker.java
package com.ibeifeng.ex2;
/*
* 负责转账业务的业务员
*/
public class ZhuanZhangBankWorker implements BankWorker {
public void operation() {
System.out.println("进行转账操作");
}
}
JiJinBankWorker.java
package com.ibeifeng.ex2;
public class JiJinBankWorker implements BankWorker {
public void operation() {
System.out.println("进行基金申购操作");
}
}
MainClass.java
package com.ibeifeng.ex2;
public class MainClass {
public static void main(String[] args) {
BankWorker bankWorker = new SavingBankWorker();
bankWorker.operation();
BankWorker bankWorker2 = new DrawingBankWorker();
bankWorker2.operation();
BankWorker bankWorker3 = new ZhuanZhangBankWorker();
bankWorker3.operation();
BankWorker bankWorker4 = new JiJinBankWorker();
bankWorker4.operation();
}
}转载自:http://blog.csdn.net/hguisu/article/details/7571617
http://www.java63.com/design_pattern/ocp.html