面向对象设计原则——开闭原则

2023-11-17

        开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。开闭原则由Bertrand Meyer于1988年提出。

        定义:开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
        在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
        任何软件都需要面临一个很重要的问题,即它们的需求会随时间的推移而发生变化。当软件系统需要面对新的需求时,我们应该尽量保证系统的设计框架是稳定的。
       如果一个软件设计符合开闭原则,那么可以非常方便地对系统进行扩展,而且在扩展时无须修改现有代码,使得软件系统在拥有适应性和灵活性的同时具备较好的稳定性和延续性。
       随着软件规模越来越大,软件寿命越来越长,软件维护成本越来越高,设计满足开闭原则的软件系统也变得越来越重要。 为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。在Java、C#等编程语言中,可以为系统定义一个相对稳定的抽象层, 而将不同的实现行为移至具体的实现层中完成。在很多面向对象编程语言中都提供了接口、抽象类等机制,可以通过它们定义系统的抽象层,再通过具体类来进行扩展。 如果需要修改系统的行为,无须对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统的功能, 达到开闭原则的要求。

例如:系统显示各种图形,有圆形、矩形、椭圆等。
       方案设计类图:

在GraphDisplay类的display方法有如下代码片段:

public void display(String type) {
    ...
    if (type.equals("Circular")) {
        Circular cir = new Circular();
        cir.display();
    }
    else if (type.equals("Triangle")) {
        Triangle  tri = new Triangle ();
        cir.display();
    }
    else {
        // TODO: other case 
    }
    ...
}

        在该代码中,如果需要增加一个新的图形类,如椭圆Oval ,则需要修改GraphDisplay类的display()方法的源代码,增加新的判断逻辑,违反了开闭原则。
        现对该系统进行重构,使之符合开闭原则。
        在本实例中,由于在GraphDisplay类的display()方法中针对每一个图表类编程,因此增加新的图表类不得不修改源代码。可以通过抽象化的方式对系统进行重构,使之增加新的图表类时无须修改源代码,满足开闭原则。
具体做法如下:

  1. 增加一个抽象图形类AbstractGraph,将各个具体图形类作为其子类。
  2. GraphDisplay类针对抽象图形类进行编程,由客户端类确认使用哪个具体图形。

         我们引入了抽象图表类AbstractGraph,且GraphDisplay针对抽象图表类进行编程,并通过setGraph()方法由客户端来设置实例化的具体图表对象, 在GraphDisplay的display()方法中调用graph对象的display()方法显示图表。如果需要增加一种新的图表,如椭圆Oval,只需要将Oval也作为AbstractGraph的子类, 在客户端向ChartDisplay中注入一个Oval对象即可,无须修改现有类库的源代码。

         其实上述的例子很像简单工厂模式工厂方法模式的改进,工厂方法模式就符合开闭原则。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象设计原则——开闭原则 的相关文章

  • 让chatgpt从一个查询接口写接口测试用例

    要求 一个查询接口 入参有currPage order pageSize sortBy 所有入参为非必须 请帮我写出这个接口所有接口用例 根据你提供的信息 下面是该查询接口所有可能的接口用例 当所有参数都不传递时 查询接口会返回所有符合条件
  • UE44如何使用Geometry(BSP)笔刷,快速创建游戏原型?

    游戏原型搭建 如何快速搭建场景 一 好处1 防止同时也放大了对应的网格 如果像unity里面一样 R放大缩小以后 网格也会对应拉伸 失真 导致了材质会被拉伸或者缩小 1 选择Geometry 在BrushSetting里面 将X Y Z对应
  • ubuntu 20.04 安装 pycharm 2022.1 .3 及其卸载

    下载 官网下载 https www jetbrains com pycharm 安装 下载好的文件显示如下 打开终端 进入你刚下载的文件所在的文件夹目录 例如我的放在Downloads这个文件夹 cd Downloads 查看文件夹里的文件
  • ROS navigation分析:navigation框架

    前言 ROS navigation stack是ROS提供的一个非常重要且常用的模块 它的主要作用是实现机器人的定位 导航和避障功能 在ROS wiki上 Maintainer把它的功能归纳为 It takes in information

随机推荐

  • 从零实现DevOps(五):Jenkins+SSH远程部署SpringBoot项目

    上篇文章 我从安装Jenkins插件开始 给大家讲解了如何从Jenkis本地环境中 以启动jar包脚本的方式部署SpringBoot项目 但是呢 以咱们日常的开发来说 所有服务都部署在一台服务器上根本就不是一个合理的方案 更不可能在所有服务
  • 基于FPGA的一维卷积神经网络CNN的实现(五)数据量化(附代码)

    数据量化 环境 Pytorch Pycham Matlab 订阅后有问题 或者需要该节的文件直接加微信 Crazzy M 说明 上一节已经通过Matlab中基础的乘加运算进行了CNN网络的前向计算过程 该节利用Matlab将导出的CNN网络
  • Object365数据/论文说明

    总览 1 目标检测数据 365类 约600k训练图片 超过一千万的bboxes 迄今为止最大的目标检测数据集 全注释的 2 服务于更好的未来研究 局部敏感类型的任务 如目标检测 语义分割 3 在COCO测试下 Objects365上预训练的
  • IDEA插件系列(33):RestfulTool插件——Restful服务开发辅助工具集

    1 插件介绍 RestfulTool插件 一套 Restful 服务开发辅助工具集 提供了一个 Services tree 的显示窗口 双击 URL 直接跳转到对应的方法定义 一个简单的 http 请求工具 支持 Spring 体系 Spr
  • npm install安装依赖总结

    node下载地址 https nodejs org en download releases 可以看到node版本 npm版本 node module版本 1 npm的全局安装路径 查看默认值 npm get prefix 默认是C Use
  • 五、网络编程之网络 IO 模型的本质.md

    IO 网络模型的本质 前置概念 1 用户空间和内核空间 学习 Linux 或者 IO 网络模型时 经常可以看到两个词 User space 用户空间 和 Kernel space 内核空间 简单说 Kernel space 是 Linux
  • 实例创建流程_ABAQUS复合材料建模及基本分析流程

    案例1 创建开孔矩形复合材料常规壳层合板 层合板一端固定 另一端施加拉伸载荷 对模型进行分析 查看每层单方向的应力 对比云图和加载时的铺层额方向 理解铺层方向与lamina材料的概念 0 1建立几何模型 利用Abaqus中composite
  • javaSE基础 数据库操作3之数据库恢复

    java基础 数据库操作3之数据库恢复 流程 上一篇写了数据的备份 本篇将写数据库的恢复操作 思想 备份文件中写入的是将数据库表转换为sql后的语句 所以备份就只需将备份文件中的sql语句执行即可 数据库恢复 public static v
  • uni-app转小程序遇到的问题 (组件使用插槽的问题)(跨端兼容、条件编译)(小程序自定义胶囊按钮封装)(uni-app挂载原型链)

    1 uni app转小程序组件使用插槽的问题 uni app封装的组件使用问题 1 插槽样式 H5页面编译是有效果的 在小程序中编译的位置错误 它会跳出本来的插槽位置到最后 解决方法 使用父传子传递值 就可以继承组件的样式 封装的组件 使用
  • python使用from keras.utils import to_categorical出错

    python使用from keras utils import to categorical出错 我使用的python编辑环境Sublime Text keras的版本2 6 0 结果语句from keras utils import to
  • 【WiFi】国产WiFi芯片

    目录 1 概述 2 WiFi芯片的市场格局 3 中国的WiFi芯片公司 3 1 华为海思 3 2 乐鑫科技 3 3 博通集成 3 4 紫光展锐 3 5 康希通信 3 6 南方硅谷 4 国产WiFi芯片竞争格局 4 1 内卷WiFi 4 4
  • 芯片后端开发基础知识(二)

    目录 1 静态时序分析 Static Timing Analysis 2 波形的压摆 Slew 3 信号偏斜 Skew 4 时序路径 Clock Path 5 时序弧 Timing Arc 6 时钟域 Clock Domain 7 工作环境
  • 【IPC-UNIX网络编程】第4章管道和FIFO

    1 一个简单的客户 服务器例子 Client从标准输入 stdin 读进一个路径名 并把它写入IPC通道 Server从该IPC通道读出这个路径名 并尝试打开其文件 若server能打开该文件 它能读出其中的内容 并写入 不一定同一个 IP
  • 本科毕设——基于人脸识别的签到系统的研究

    本人普通四非本科 毕设选了这个比较大众且成熟的选题 四处借鉴后完成了论文 现在写写一些我完成毕设期间的历程 在完成论文开题报告后我开始寻求代码以期完成一个简易人脸识别签到系统的设计 开始我用了舍友选修课人工智能的大作业 他所采用的是传统的h
  • Adapter模式——设计模式学习笔记

    Adapter模式 一 意图 将一个类的接口转换成客户希望的另外一个接口 Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作 二 动机 为复用而设计的通用的类 总是存在一些特殊的情况 使其不能够使用或者完成相应的
  • pt工具常用命令

    pt工具介绍 Percona Toolkit简称pt工具 是Percona公司开发用于管理MySQL的工具 功能包括检查主从复制的数据一致性 检查重复索引 定位IO占用高的表文件 在线DDL等 DBA熟悉掌握后将极大提高工作效率 下载地址h
  • YOLO物体检测-系列教程2:YOLOV2整体解读

    YOLO 系列教程 总目录 YOLOV1整体解读 YOLOV2整体解读 YOLOV2提出论文 YOLO9000 Better Faster Stronger 1 YOLOV1 优点 快速 简单 问题1 每个Cell只预测一个类别 如果重叠无
  • 第二十七课、应用程序中的主窗口------------------狄泰软件学院

    一 主窗口的概念 1 应用程序中的主窗口 1 主窗口是与用户进行长时间交互的顶级窗口 2 程序的绝大多数功能直接由主窗口提供 3 主窗口通常是应用程序启动后显示的第一个窗口 4 整个程序由一个主窗口和多个对话框组成 2 Qt中的主窗口 1
  • leetcode排序算法总结—时间复杂度o(nlogn)-希尔/堆排/快排/归并小记

    排序算法总结 时间复杂度O nlogn 希尔 堆排序 快排 归并 希尔排序 有一段间隔的排序 可以逐个子表进行排序 然 例如王道 都给出便于计算机进行连续访问的程序算法 即依次按元素比较不同子表进行子表的调整 时间复杂度O n 1 3 最坏
  • 面向对象设计原则——开闭原则

    开闭原则是面向对象的可复用设计的第一块基石 它是最重要的面向对象设计原则 开闭原则由Bertrand Meyer于1988年提出 定义 开闭原则 Open Closed Principle OCP 一个软件实体应当对扩展开放 对修改关闭 即