public class Ocp {
public static void main(String[] args) {
// 使用看看存在的问题
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawShape(new Rectangle());
graphicEditor.drawShape(new Circle());
graphicEditor.drawShape(new Triangle());
}
}
// 这是一个用于绘图的类 [使用方]
class GraphicEditor {
// 接收 Shape 对象,然后根据 type,来绘制不同的图形
public void drawShape(Shape s) {
if (s.m_type == 1) drawRectangle(s);
else if (s.m_type == 2) drawCircle(s);
else if (s.m_type == 3) drawTriangle(s);
}
// 绘制矩形
public void drawRectangle(Shape r) {
System.out.println(" 绘制矩形 ");
}
// 绘制圆形
public void drawCircle(Shape r) {
System.out.println(" 绘制圆形 ");
}
// 绘制三角形
public void drawTriangle(Shape r) {
System.out.println(" 绘制三角形 ");
}
}
// Shape 类,基类
class Shape {
int m_type;
}
class Rectangle extends Shape {
Rectangle() {
super.m_type = 1;
}
}
class Circle extends Shape {
Circle() {
super.m_type = 2;
}
}
// 新增画三角形
class Triangle extends Shape {
Triangle() {
super.m_type = 3;
}
}
把创建 Shape 类做成抽象类,并提供一个抽象的 draw 方法,让子类去实现即可,这样我们有新的图形种类时,只需要让新的图形类继承 Shape,并实现 draw 方法即可,使用方的代码就不需要修改 -> 满足了开闭原则。
public class Ocp {
public static void main(String[] args) {
// 使用看看存在的问题
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawShape(new Rectangle());
graphicEditor.drawShape(new Circle());
graphicEditor.drawShape(new Triangle());
graphicEditor.drawShape(new OtherGraphic());
}
}
// 这是一个用于绘图的类 [使用方]
class GraphicEditor {
// 接收 Shape 对象,调用 draw 方法
public void drawShape(Shape s) {
s.draw();
}
}
// Shape 类,基类
abstract class Shape {
int m_type;
public abstract void draw();// 抽象方法
}
class Rectangle extends Shape {
Rectangle() {
super.m_type = 1;
}
@Override
public void draw() {
System.out.println(" 绘制矩形 ");
}
}
class Circle extends Shape {
Circle() {
super.m_type = 2;
}
@Override
public void draw() {
System.out.println(" 绘制圆形 ");
}
}
// 新增画三角形
class Triangle extends Shape {
Triangle() {
super.m_type = 3;
}
@Override
public void draw() {
System.out.println(" 绘制三角形 ");
}
}
// 新增一个图形
class OtherGraphic extends Shape {
OtherGraphic() {
super.m_type = 4;
}
@Override
public void draw() {
System.out.println(" 绘制其它图形 ");
}
}
开闭原则(OCP)是面向对象设计中的一个核心原则,它引导着软件实体如类、模块和函数应该在不修改现有代码的情况下进行扩展。其中核心思想就是对扩展开放,对修改关闭。开闭原则是提高软件系统可维护性和灵活性的重要手段。在实际应用中,应充分考虑需求的变动性,合理使用抽象和设计模式来封装变化,从而有效实现开闭原则。同时,也要注意设计的复杂度和性能影响,以便在保持系统稳定的同时,兼顾开发效率和运行效率。