开放封闭原则
开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。其他的设计原则,很多时候是为实现这一目标服务的,例如以Liskov替换原则实现最佳的、正确的继承层次,就能保证不会违反开放封闭原则。
关于开放封闭原则,其核心的思想是:
软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。 因此,开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
示例
面向抽象编程,计算一个圆柱体体积,分矩形底和圆形底。
Geometry.java
package com.ab;
public abstract class Geometry {
public abstract double getArea();
}
Circle.java
package com.ab;
//第一个子类
public class Circle extends Geometry{
double r;
Circle(double r){
this.r = r;
}
public double getArea(){
return (3.14*r*r);
}
}
//第二个子类
class Rectangle extends Geometry{
double a;
double b;
public Rectangle(double a, double b) {
this.a = a;
this.b = b;
}
@Override
public double getArea() {
// TODO Auto-generated method stub
return a*b;
}}
Pillar.java
package com.ab;
public class Pillar {
Geometry bottom;
double height;
Pillar(Geometry bottom,double height){
this.bottom =bottom;
this.height = height;
}
public double getVolume(){
return bottom.getArea()*height;
}
}
Application.java
package com.ab;
public class Application {
public static void main(String[] args) {
Pillar pillar;
Geometry bottom;
bottom = new Rectangle(12, 22);
pillar = new Pillar(bottom, 58);
System.out.println("矩形底的圆柱体体积"+pillar.getVolume());
bottom = new Circle(10);
pillar = new Pillar(bottom, 58);
System.out.println("圆形底的圆柱体体积"+pillar.getVolume());
}
}
矩形底的圆柱体体积15312.0
圆形底的圆柱体体积18212.0
UML类图
该设计中Geometry和Pillar类就是系统中对修改关闭的部分,而Geometry的子类就是对扩展开放的部分,当向系统再增加任何Geometry的子类时(对扩展开放),不必修改Pillar类,就可以使用Pillar创建出具有Geometry的新子类指定的底的柱体。
-java程序设计实用教程 p105