基本介绍
- 开闭原则(Open Closed Principle) 是编程中最基础、最重要的设计原则
- 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。
就比如开发新需求,你大可以扩展代码,但是你要确保原先的调用者不用发生一丁点变化。 - 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
- 编程中使用设计模式的目的就是为了遵循开闭原则。
反例:
代码实现如下:
public abstract class Shape {
int shapeType;
}
public class Rectangle extends Shape{
public Rectangle() {
super.shapeType=1;
}
}
public class Circle extends Shape{
public Circle() {
super.shapeType=2;
}
}
//这是一个用于绘图的类【使用方】
public class GraphicEditor {
public void drawShape(Shape s){
if (s.shapeType==1) {
drawRectangle(s);
}else if (s.shapeType==2){
drawCircle(s);
}
}
private void drawCircle(Shape s) {
System.out.println("绘制圆形");
}
private void drawRectangle(Shape s) {
System.out.println("绘制矩形");
}
}
public class Main {
public static void main(String[] args) {
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawShape(new Rectangle());
graphicEditor.drawShape(new Circle());
}
}
如上设计,当我们要绘制一个新的图形,比如三角形,我们一定要动到GraphicEditor这个使用方的类,这样就违反了开闭原则了。
public class Triangle extends Shape{
public Triangle() {
super.shapeType=3;
}
}
public class GraphicEditor {
public void drawShape(Shape s){
//省略重复代码...
else if (s.shapeType==2){
drawTriangle(s);
}
}
private void drawTriangle(Shape s) {
System.out.println("绘制三角形");
}
}
正例:
思路: 我们在shape类中提供一个抽象方法,让子类去实现即可。这样当我们有新的图形类继承的时候,实现draw方法即可,也避免修改使用方的代码,从而满足开闭原则。
public abstract class Shape {
int shapeType;
abstract void drawShape();
}
public class Rectangle extends Shape {
public Rectangle() {
super.shapeType=1;
}
@Override
void drawShape() {
System.out.println("绘制矩形");
}
}
public class Circle extends Shape {
public Circle() {
super.shapeType=2;
}
@Override
void drawShape() {
System.out.println("绘制圆形");
}
}
//这是一个用于绘图的类【使用方】
public class GraphicEditor {
public void drawShape(Shape s){
s.drawShape();
}
}
public class Main {
public static void main(String[] args) {
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawShape(new Rectangle());
graphicEditor.drawShape(new Circle());
}
}
如 依赖倒转原则的正例,也是符合开闭原则的范例,可以回顾下~