设计模式原则 - 开闭原则(五)

news2025/1/24 11:32:08

开闭原则

  • 一 官方定义
    • 基本介绍
  • 二 案例演示
    • 普通实现方式
      • 案例分析
    • 开闭原则实现
      • 案例分析
  • 三 注意事项

一 官方定义

开闭原则( 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("绘制三角形 --- 绘制成功");
    }

在这里插入图片描述

案例分析

添加了三角形绘图的子类,调用方无任何修改。完全符合开闭原则。针对调用方无任何修改,针对提供方是可以扩展的

在这里插入图片描述

三 注意事项

  • 开闭原则最基础最重要的设计原则
  • 开闭原则可以提高复用性和可维护性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java+Swing+Mysql实现停车场管理系统

基于JavaSwingMysql实现停车场管理系统一、系统介绍二、系统展示三、其它1.其他系统实现一、系统介绍 1.系统功能 用户 1.登录系统 2.信息查询 包含计费标准,当前在场信息,用户历史信息,用户个人信息,出入场信息,当前…

Win10提示错误代码0xc0000001的解决办法

​有一些朋友在使用Win10系统的时候会遇到蓝屏故障,提示“无法正常启动你的电脑,在多次尝试后,你的电脑上的操作系统仍无法启动,因此需求对其进行修复。” Win10提示恢复无法正常启动你的电脑0xc0000001 故障原因: 错误…

实战案例:初探工程配置 图标组件热身

点击上方卡片“前端司南”关注我您的关注意义重大原创前端司南前言本文是 基于ViteAntDesignVue打造业务组件库[1] 专栏第 3 篇文章【实战案例:初探工程配置 & 图标组件热身】,我将从业务系统中最基础的图标组件入手,带着读者们练练手找找…

websocket的用处及vue和SpringBoot和nginx的引入-入门

websocket的用处及vue和SpringBoot的引入-入门 为什么要有websocket 微信 想一个场景,扫码登录,服务器并不知道用户有没有扫码,怎么办,一种办法是HTTP定时轮询,1-2秒就请求一次服务端,看看用户有没有扫码…

5.3 常见的电感式和电容式感测原理及应用

常见的电感式和电容式感测应用1、电感式和电容式工作原理1.1 电感式感测工作原理1.2 电容式感测工作原理2 FDC:电容式液位感测2.1 电容技术在液位感测中的优势2.2 电容式液位感测入门3 LDC:电感式触控按钮4 LDC:增量编码器和事件计数5 LDC&am…

再学C语言10:字符串(1)

一、字符串定义 字符串:一个或多个字符的序列 "hello world!" 双引号并不是字符串的一部分,只是用于通知编译器其中包含了一个字符串 C没有为字符串定义专门的变量类型,而是将其存储在char数组中 字符串中的字符存放在相邻的存…

Amazon 4.7 星评,领域新经典,了解服务设计就读它

2011 年,Adaptive Path 公司的 Brandon Schauer 粗略估算,美国每年在服务的规划和设计上大约花费 20 亿美元,但其中仅有 7000 万美元(大约 3.5%)花在了“服务设计”上。做另外 96.5% 的工作的那些人,从不觉…

参加大学生数学建模大赛,Matlab和Python到底哪个更好?

前言 后台的小伙伴经常会问编程过程中,MATLAB和Python到底哪个更好?这个问题一直困惑很多同学,今天小编来给大家从实用型来综合分析一下: 首先从两者各自的应用做个对比。 一、python的优势 Python相对于Matlab最大的优势&…

Mac M2芯 k8s(minikube)超详细实战 - 单节点部分

概述 我使用的电脑是Mac pro M2芯的,使用的虚拟环境是 Ubuntu 22.04 ,M2芯兼容性不是特别好,所以尽量跟我博客中的版本保持一致。 虚拟机环境 Ubuntu 22.04docker :20.10.17minikube:v1.25.2 搭建minikube虚拟机环境…

【强化学习基础】强化学习的基本概念:状态、动作、智能体、策略、奖励、状态转移、轨迹、回报、价值函数

文章目录1.状态(State)2.动作(Action)3.智能体(Agent)4.策略(Policy)5.奖励(Reward)6.状态转移(State transition)7.智能体与环境交互…

高效率的Python开发工具——PyCharm v2022.3正式发布

JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。 PyCharm v2022.3官方正式版下载(q技术交流:786598704)…

wireshark抓包数据提取TCP/UDP/RTP负载数据方法

wireshark抓包数据提取TCP_UDP_RTP负载数据方法 文章目录wireshark抓包数据提取TCP_UDP_RTP负载数据方法1 背景2 TCP和UDP负载提取方式3 RTP负载提取方式1 背景 在视频抓包分析过程中,有时候需要从TCP、UDP、RTP中直接提取payload数据,比如较老的摄像机…

微课堂助力在线教育招生引流方式_付费视频系统搭建对在线教育的作用

一、借助优惠码线上线下推广课程 1、线下发传单: 机构先在我们后台创建对应课程的通用优惠码,然后再制作课程传单介绍页。传单上显示出对应课程的通用优惠码,线下派发传单给到用户。 2、线下刮刮卡片推广:将私有码制作成卡片配合…

SVM(二)对偶问题转化以及求解

上篇: SVM(支持向量机)(一)基本形式推导 凸优化 考虑如下优化问题: 应用拉格朗日乘子法: 定义拉格朗日对偶函数G\mathcal{G}G,这里 infinfinf 是上确界(集合的最小上…

超标量处理器设计——第十章_提交

参考《超标量处理器》姚永斌著 文章目录超标量处理器设计——第十章_提交10.1 概述10.2 重排序缓存10.2.1 一般结构10.2.2 端口需求10.3 管理处理器的状态10.3.1 使用ROB管理指令集定义的状态10.3.2 使用物理寄存器管理指令集定义的状态10.4 特殊情况处理10.4.1 分支预测失败的…

【微服务】Nacos ⼀致性协议

目录 一、为什么 Nacos 需要⼀致性协议 二、为什么 Nacos 选择了 Raft 以及 Distro 1、从服务注册发现来看 2、从配置管理来看 3、为什么是 Raft 和 Distro 呢 三、早期的 Nacos ⼀致性协议 四、当前 Nacos 的⼀致性协议层 💖 Spring家族及微服务系列文章 …

【关于时间序列的ML】项目 2 :使用机器学习预测股票价格

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

5G无线技术基础自学系列 | RF优化流程

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 在介绍完了RF优化的思路和措施之后&…

【Linux 软件包管理器 yum】

While there is life there is hope. 目录 1 什么是软件包 2 关于 rzsz 3 注意事项 4 查看软件包 5 如何安装软件 6 如何卸载软件 总结 1 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人…

[译] 来了解一下 Island Architecture 孤岛架构

建立一个网站有不同的方法,其中之一便是多页应用程序(MPA),它大约在十年前就过时了,现在又重新流行起来。MPA已经被Angular和React以及其他现代框架所普及的单页应用(SPA)方法所取代。 由于应用软件迭代趋势的运作方式,方法/工具…