当前位置: 首页 > news >正文

设计模式——开闭原则

文章目录

  • 基本介绍
  • 看下面一段代码
  • 方式 1 的优缺点
  • 改进的思路分析

基本介绍

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

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

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

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

看下面一段代码

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

- :

代码展示:

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());}
}//这是一个绘图的类 [使用方]
class GraphicEditor {// 接受Shape对象,然后根据type,来绘制不同的图形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("绘制三角形");}}//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;}
}

方式 1 的优缺点

  1. 优点是比较好理解,简单易操作。
  2. 缺点是违反了设计模式的 ocp 原则,即对扩展开放(提供方),对修改关闭(使用方)。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码.
  3. 比如我们这时要新增加一个图形种类 三角形,我们需要做如下修改,修改的地方较多

改进的思路分析

思路:把创建 Shape 类做成抽象类,并提供一个抽象的 draw 方法,让子类去实现即可,这样我们有新的图形种类时,只需要让新的图形类继承 Shape,并实现 draw 方法即可,使用方的代码就不需要修 -> 满足了开闭原则

改进后的代码:

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 OtherGraph());}
}//这是一个绘图的类 [使用方]
class GraphicEditor {// 接受Shape对象,调用draw方法public void drawShape(Shape s) {s.draw();}	
}//Shape类,基类
abstract class Shape {//抽象方法public abstract void draw();}class Rectangle extends Shape {@Overridepublic void draw() {// TODO Auto-generated method stubSystem.out.println("绘制矩形");}
}class Circle extends Shape {@Overridepublic void draw() {// TODO Auto-generated method stubSystem.out.println("绘制圆形");}
}//新增画三角形
class Triangle extends Shape{@Overridepublic void draw() {// TODO Auto-generated method stubSystem.out.println("绘制三角形");}	
}//新增一个图形
class OtherGraph extends Shape{@Overridepublic void draw() {// TODO Auto-generated method stubSystem.out.println("绘制其他图形");}}

相关文章:

设计模式——开闭原则

文章目录 基本介绍看下面一段代码方式 1 的优缺点改进的思路分析 基本介绍 开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽…...

服务器能运行什么应用

服务器能运行什么应用 服务器是一种应用范围很广的网络技术产品,它在影视、视频以及医疗和金融等多个领域,都可以发挥使用价值,那么服务器能运行什么应用?大家跟着壹基比小鑫一起来了解吧! 服务器的作用是什么? 服…...

Linux TCP协议

传输层的协议主要有三个:TCP协议(可靠)、UDP协议(不可靠)和SCPT协议(不可靠)。 一、TCP协议的概念 TCP协议也称传输控制协议,是一种可靠的、面向连接的、基于字节流的传输层通信协…...

pytorch 入门1-tensor 广播 view reshape

tensor 的四则运算broadcast import torch import numpy as np # 张量tensor 随机初始化 x torch.rand(4,3) print(x) y torch.randn(4,3) print(y)# 初始化全零 张量 a torch.zeros((4,4),dtypetorch.long) print(a) #初始化全一 张量 b torch.ones(4,4) print(b) c tor…...

Spring参数注解,支持数组入参(List)校验

Spring参数注解,支持数组入参(List)校验 1、controller类增加Validated注解,对应的数组参数增加Valid注解。 Validated RestController RequestMapping("/parent") public class ParentController {private FatherRepos…...

如何使用ArcGIS进行可视化分析

概述 通视分析是指以某一点为观察点,研究某一区域通视情况的地形分析,利用DEM判断地形上任意两点之间是否可以互相可见的技术方法,分为视线通视分析和视域通视分析,前者判断任意两点之间能否通视,后者从任一点出发&am…...

计算机竞赛 基于LSTM的天气预测 - 时间序列预测

0 前言 🔥 优质竞赛项目系列,今天要分享的是 机器学习大数据分析项目 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/po…...

uniapp 回退到指定页面 保存页面状态

uniapp 历史页面回退到指定页面。 getCurrentPages() 内容如下 let delta getCurrentPages().reverse().findIndex(item > item.route "pages/popularScience/daodi") if(delta-1){uni.navigateTo({url: /pages/popularScience/daodi,success: res > {},fa…...

ansible(1)-- 部署ansible连接被控端

目录 一、部署ansible 1.1 安装 1.2 测试连接 192.168.136.55 ansible 192.168.136.56被控端 一、部署ansible 1.1 安装 zabbix-s只是主机名,不用在意,更好该主机也安装了zabbix,不好更改。 下载阿里云epel源 #安装阿里云的epel源&#…...

Log4j反序列化命令执行漏洞(CVE-2017-5645)Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)

一.Log4j反序列化命令执行漏洞(CVE-2017-5645) Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码 环境:vulhub 工具下载地址&#xff1…...

echarts 之 科技感进度条

1.图片展示 2.代码实现 /* ng qty 进度条 */ <template><div class"ngqty-progress"><div class"ngqty-info"><span>X4</span><span>50%</span></div><div :id"barNgQtyProgress index" c…...

基于gin关于多级菜单的处理

多级菜单是很多业务场景需要的。下面是一种处理方式 // 生成树结构 func tree(menus []*video.XkVideoCategory, parentId uint) []*video.XkVideoCategory {//定义子节点目录var nodes []*video.XkVideoCategoryif reflect.ValueOf(menus).IsValid() {//循环所有一级菜单for …...

Oracle/PL/SQL奇技淫巧之Lable标签与循环控制

在一些存储过程场景中&#xff0c;可能存在需要在满足某些条件时跳出循环的场景&#xff0c; 但是在PL/SQL中&#xff0c;不能使用break语句直接跳出循环, 但是可以通过lable标签的方式跳出循环&#xff0c;例&#xff1a; <<outer_loop>> FOR i IN 1..5 LOOPDBMS…...

Docker基础操作

1.安装docker服务&#xff0c;配置镜像加速器 安装docker服务 清理缓存 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-enginesystemctl enable --now docker 脚…...

AMBA总线协议(8)——AHB(六):分割传输

一、前言 在之前的文章中&#xff0c;我们重点介绍了AHB传输的仲裁&#xff0c;首先介绍了仲裁相关的信号&#xff0c;然后分别介绍了请求总线访问&#xff0c;授权总线访问&#xff0c;猝发提前终止&#xff0c;锁定传输和默认主机总线&#xff0c;在本文中我们将继续介绍AHB的…...

时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化

时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于SWD群体分解的分量可视化&#xff0c;基于群体分解的信号分解技术&#xff0c;MATLAB程序…...

【makefile】自动化变量的简述及实例

文章目录 10. env20. 简述百度百科常用的自动化变量 30. 实例90. 附件下载 10. env ubuntu1804 GNU Make 4.120. 简述 百度百科 https://baike.baidu.com/item/Makefile/4619787?frge_ala makefile 文件的格式&#xff1a; 目标&#xff1a;依赖命令软件编译的流程概述&am…...

IntelliJ IDEA 官方网站 idea官网 http://www.jetbrains.com/idea/

IntelliJ IDEA 官方网站 idea官网 http://www.jetbrains.com/idea/ Idea下载官网一键直达&#xff1a; 官网一键直达...

C#,《小白学程序》第一课:初识程序

曰&#xff1a;扫地僧练就绝世武功的目的是为了扫地更干净。 1 文本格式 /// <summary> /// 《小白学程序》第一课&#xff1a;初识程序 /// </summary> /// <param name"sender"></param> /// <param name"e"></param&…...

LeetCode--HOT100题(38)

目录 题目描述&#xff1a;226. 翻转二叉树&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;226. 翻转二叉树&#xff08;简单&#xff09; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 LeetCode做题链…...

别再忍受龟速下载了!实测国内15个Anaconda镜像站,教你一键换源(附测速工具)

告别卡顿&#xff01;国内Anaconda镜像站深度评测与智能换源实战指南 每次conda install等上半小时&#xff1f;看着进度条像蜗牛爬&#xff1f;作为Python开发者&#xff0c;包管理工具的下载速度直接决定了工作效率。上周帮团队调试一个数据分析项目时&#xff0c;有位同事的…...

Navicat Premium 试用期重置实践:3种技术方案深度解析

Navicat Premium 试用期重置实践&#xff1a;3种技术方案深度解析 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 对于macOS平…...

为OpenClaw智能体工作流配置Taotoken模型服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为OpenClaw智能体工作流配置Taotoken模型服务 OpenClaw是一个用于构建和编排AI智能体的开源框架&#xff0c;它支持通过配置来连接…...

告别卡顿!用NoMachine在Win10上流畅远程Ubuntu Gnome桌面的保姆级教程

告别卡顿&#xff01;用NoMachine在Win10上流畅远程Ubuntu Gnome桌面的保姆级教程 远程办公和跨平台协作已成为现代工作流的标配&#xff0c;但当你需要从Windows电脑连接到Ubuntu Gnome桌面时&#xff0c;传统的远程方案往往让人抓狂——画面撕裂、输入延迟、音频卡顿&#xf…...

Claude Code用户如何配置Taotoken解决密钥与额度问题

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Claude Code用户如何配置Taotoken解决密钥与额度问题 对于使用Claude Code进行编程辅助的开发者来说&#xff0c;直接使用原厂服务…...

HsMod炉石传说插件终极指南:55项功能完全解锁

HsMod炉石传说插件终极指南&#xff1a;55项功能完全解锁 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是基于BepInEx框架开发的炉石传说多功能增强插件&#xff0c;为玩家提供游戏…...

Leaflet数据加载实战:从本地GeoJSON到在线地图服务的完整指南

1. 从零开始&#xff1a;Leaflet与空间数据加载基础 第一次接触Leaflet加载空间数据时&#xff0c;我盯着屏幕上的空白地图和报错信息发呆了半小时。作为轻量级地图库的标杆&#xff0c;Leaflet确实能让开发者快速创建交互式地图&#xff0c;但数据加载这个环节却藏着不少&quo…...

对比直接使用官方API体验Taotoken在多模型切换上的便利性

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接使用官方API体验Taotoken在多模型切换上的便利性 在构建需要集成多种大语言模型的应用时&#xff0c;开发者常常面临一个现…...

从被动挨打到主动出击:用upstream_check_module为你的微服务网关加上“心跳监护仪”

微服务网关的健康守护者&#xff1a;实战Nginx upstream_check_module 微服务架构的复杂性往往隐藏在那些看似简单的API调用背后。当你的系统从单体应用拆分成数十个微服务&#xff0c;每个服务又有多个实例运行时&#xff0c;网关层的健康检查就成了整个系统稳定性的第一道防线…...

IWR1642与mmWave Studio实战:从参数配置到数据解析的完整指南

1. IWR1642与mmWave Studio初探&#xff1a;为什么参数配置如此重要 第一次接触TI的IWR1642评估板和mmWave Studio软件时&#xff0c;很多人会被各种参数搞得晕头转向。我刚开始用的时候也是这样&#xff0c;看着界面上密密麻麻的选项&#xff0c;完全不知道从哪下手。后来才发…...