开放-封闭原则(The Open-Closed Principle,OCP):一个软件实体(如类、模块)对扩展开放(对提供方而言),对修改关闭(对使用方而言)
编程中遵循其他原则,以及使用设计模式的目的,最终都是为了遵循开闭原则(核心)!!!
例子:
//绘图类,是使用方
class DrawShape{
public void drawShape(Shape shape){
if(shape.m_type == 1){
drawCircle();
}
else if(shape.m_type == 2){
drawRectangle();
}
//增加画三角形的功能,需要在适用方增加else分支,不合理
else if(shape.m_type == 3){
drawTriangle();
}
}
void drawCircle(){
System.out.println("draw circle...");
}
void drawRectangle(){
System.out.println("draw rectangle...");
}
//增加画三角形的功能,在使用方也需要修改,这是不合理的做法
void drawTriangle(){
System.out.println("draw triangle...");
}
}
//图形类,是提供方
class Shape{
int m_type;
}
class Circle extends Shape{
Circle(){
m_type = 1;
}
}
class Rectangle extends Shape{
Rectangle(){
m_type = 2;
}
}
//增加三角形的类
class Triangle extends Shape{
Triangle(){
m_type = 3;
}
}
可以发现:如果要增加画三角形的功能,则需要增加一个三角形的类,这是扩展,但是同时得对使用方DrawShape增加一个else分支,这对修改也开放了,是不合理的
通过抽象来改进:
//绘图类,是使用方
class DrawShape{
public void drawShape(Shape shape){
shape.draw();
}
}
//图形类,是提供方
abstract class Shape{
abstract void draw();
}
class Circle extends Shape{
void draw(){
System.out.println("draw circle...");
}
}
class Rectangle extends Shape{
void draw(){
System.out.println("draw rectangle...");
}
}
//增加一个话三角形的功能,只需要增加一个扩展类就可以,对使用方没有修改
class Triangle extends Shape{
void draw(){
System.out.println("draw triangle...");
}
}