开闭原则
- 一 官方定义
- 基本介绍
- 二 案例演示
- 普通实现方式
- 案例分析
- 开闭原则实现
- 案例分析
- 三 注意事项
一 官方定义
开闭原则( Open Close Principle ),又称为OCP原则,他的官方定义如下:
Software entities like classes,modules and functions should be open for extension but closed for modifications.
一个软件实体如类,模块和函数应该对扩展开放,对修改关闭
基本介绍
对扩展开放 – 提供方
对修改关闭 – 调用方
就是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。那么什么是软件实体呢?软件实体包括一下几个部分:
- 项目或软件产品中按照一定的逻辑规则划分的模块。
- 抽象和类。
- 方法。
二 案例演示
在已有可以绘制圆形,矩形的绘图工具中添加一个可以绘制三角形的需求。
普通实现方式
//案例演示 - 开闭原则
public class OcpDemo {
public static void main(String[] args) {
new GraphicEditor().drawShape(new Rectangle());
new GraphicEditor().drawShape(new Circle());
new GraphicEditor().drawShape(new Triangle());
}
}
//需求:绘制三角形
// 用于绘图的类 [调用方]
class GraphicEditor {
//按类型绘制图形
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(" 正在绘制三角形中---绘制成功");
}
}
//形状基类
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;
}
}
案例分析
通过新增绘制三角形需求,我们对调用方做了一系列的改动。
这违背了开闭原则中对调用方关闭修改。
开闭原则实现
//案例改进 - 使用开闭原则
public class OcpDemo {
public static void main(String[] args) {
new GraphicEditor().drawShape(new Circle());
new GraphicEditor().drawShape(new Rectangle());
new GraphicEditor().drawShape(new Triangle());
}
}
//调用方
class GraphicEditor{
public void drawShape(Shape shape){
shape.draw();
}
}
//抽象基类
abstract class Shape{
//抽象方法
public abstract void draw();
}
//矩形类
class Rectangle extends Shape{
@Override
public void draw() {
System.out.println("绘制矩形中 --- 绘制成功");
}
}
//圆形类
class Circle extends Shape{
@Override
public void draw() {
System.out.println("绘制圆形 --- 绘制成功");
}
}
//三角形类
class Triangle extends Shape{
@Override
public void draw() {
System.out.println("绘制三角形 --- 绘制成功");
}
案例分析
添加了三角形绘图的子类,调用方无任何修改。完全符合开闭原则。针对调用方无任何修改,针对提供方是可以扩展的
三 注意事项
- 开闭原则最基础最重要的设计原则
- 开闭原则可以提高复用性和可维护性