前言
设计模式相关文章主要来自B站尚硅谷的学习视频的心得 B站视频传送门
设计模式系列文章传送门23种设计模式系列合集
有空会慢慢更新学习心得,相关源码在 Github
基本介绍
(ocp)开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则
一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。
当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。
使用
看一个画图形的功能,类图设计,如下:

代码
package learn.lhb.design.patterns.principle.ocp;
import java.awt.*;
/**
* 开闭原则 案例 1 有缺陷
* 原理: 对扩展开放(提供方),对修改关闭(使用方)
* 缺陷:
* 假如现在要新添加一个图形三角形种类,需要做如下修改,修改的地方比较多,
* 而开闭原则是尽量不修改代码,或者尽可能少修改代码
*
* 改进思路:
* 把创建Shape类 修改成抽象类,并提供一个抽象的draw方法,让子类去实现即可,
* 这样,有新的图形种类时,只需要让新的图形类继承Shape,并实现draw方法即可。
* 这样就满足了开闭原则。
*
* @author 梁鸿斌
* @date 2020/3/19.
* @time 22:21
*/
public class Ocp {
public static void main(String[] args) {
// 使用,来看看存在什么问题
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawShape(new Rectangle());
graphicEditor.drawShape(new Circle());
graphicEditor.drawTriangle(new Triangle());
}
}
/**
* 用于绘图的类(使用方)
*/
class GraphicEditor {
/**
* 接收 Shape对象,然后根据type来绘制不同的图形
* @param shape
*/
public void drawShape(Shape shape) {
if (shape.m_type == 1) {
drawRectangle(shape);
} else if (shape.m_type == 2) {
drawCircle(shape);
} else if (shape.m_type == 3) {
drawCircle(shape);
}
}
public void drawRectangle(Shape r) {
System.out.println(" 绘制矩形 ");
}
public void drawCircle(Shape r) {
System.out.println(" 绘制圆形 ");
}
public void drawTriangle(Shape shape) {
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;
}
}
上述方法对优缺点:
优点是比较好理解,简单易操作。
缺点是违反了设计模式的 ocp 原则,即对扩展开放(提供方),对修改关闭(使用方)。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码.
比如我们这时要新增加一个图形种类 三角形,我们需要做如下修改,修改的地方较多
修改完善代码演示
- 思路:把创建 Shape 类做成抽象类,并提供一个抽象的 draw 方法,让子类去实现即可,这样我们有新的图形种类时,只需要让新的图形类继承 Shape,并实现 draw 方法即可,使用方的代码就不需要修 -> 满足了开闭原则
- 改进后的代码:
package learn.lhb.design.patterns.principle.ocp.improve;
/**
* 开闭原则 案例 2
* 满足开闭原则,对扩展开放,对修改关闭
*
* @author 梁鸿斌
* @date 2020/3/19.
* @time 22:21
*/
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方法
* @param shape
*/
public void drawShape(Shape shape) {
// 调用方法
shape.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(" 绘制其他图形 ");
}
}
有问题欢迎私信/评论指出,谢谢您的观看,希望对您有帮助哦!
https://lianghongbin.blog.csdn.net/
版权声明:本文为weixin_44772609原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。