七大设计原则-开闭原则

前言

设计模式相关文章主要来自B站尚硅谷的学习视频的心得 B站视频传送门

设计模式系列文章传送门23种设计模式系列合集

有空会慢慢更新学习心得,相关源码在 Github


基本介绍

  • (ocp)开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则

  • 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。

  • 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。

  • 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。


使用

看一个画图形的功能,类图设计,如下:

开闭原则图01

代码

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版权协议,转载请附上原文出处链接和本声明。