- 概念:指导我们编写易于扩展和修改的软件系统。软件开闭原则的核心思想是:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
- 原理:通过抽象和多态来实现的。通过定义抽象的接口和类,以及利用多态性,可以在不修改现有代码的情况下对系统进行扩展和修改,从而实现软件开闭原则。
- 使用场景
- 当需要添加新的功能时,不修改现有代码,只需添加新的类或模块。
- 当需要修改现有功能时,通过继承、接口实现等方式来扩展功能,而不是直接修改原有代码。
public interface Shape {
void draw();
}
// 矩形类
class Rectangle implements Shape {
public void draw() {
System.out.println("绘制矩形");
}
}
// 圆形类
class Circle implements Shape {
public void draw() {
System.out.println("绘制圆形");
}
}
// 椭圆类
class Ellipse implements Shape {
public void draw() {
System.out.println("绘制椭圆");
}
}
// 图形绘制程序
class ShapeDrawer {
private final List<Shape> shapes = new ArrayList<>();
private void addShape(Shape shape) {
shapes.add(shape);
}
private void drawAllShapes() {
for (Shape shape : shapes) {
shape.draw();
}
}
public static void main(String[] args) {
ShapeDrawer shapeDrawer = new ShapeDrawer();
Shape shape = new Ellipse();
shapeDrawer.addShape(shape);
shapeDrawer.drawAllShapes();
}
}
上述代码例子中按照遵循软件开闭原则。当需要增加新的图形类型时,只需编写新的实现了Shape接口的类,而不需要修改原有的ShapeDrawer类。这样,我们就实现了对扩展开放,对修改关闭的设计。
- 概念及设计思想:高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
- 原理:依赖倒置原则通过引入抽象来解耦模块之间的直接依赖关系,从而降低模块之间的耦合度。高层模块通过抽象接口来与低层模块通信,而具体的实现细节则由低层模块来实现。这样一来,模块之间的依赖关系更加灵活,可以更容易地进行扩展和替换。
- 使用场景:
- 当需要实现模块之间的松耦合,降低模块间的直接依赖关系,可以使用依赖倒置原则。
public interface ICourse {
void study();
}
class AICourse implements ICourse {
@Override
public void study() {
System.out.println("学习AI课程");
}
}
class JavaCourse implements ICourse {
@Override
public void study() {
System.out.println("学习Java课程");
}
}
class PythonCourse implements ICourse {
@Override
public void study() {
System.out.println("学习Python课程");
}
}
class Tom {
private ICourse course;
public void setCourse(ICourse course) {
this.course = course;
}
public void study() {
course.study();
}
}
class Test {
public static void main(String[] args) {
Tom tom = new Tom();
tom.setCourse(new JavaCourse());
tom.study();
tom.setCourse(new PythonCourse());
tom.study();
tom.setCourse(new AICourse());
tom.study();
}
}