设计原则之一:开放封闭原则

开放封闭原则:设计原则中的重要概念 [.NET 在这个基本的订单类中,我们定义了订单的基本属性,如订单号(Id)和订单总金额(TotalAmount),并提供了一个虚拟方法CalculateDiscount()来计算订单的折扣金额。这个原则的核心思想是,通过遵守开放封闭原则,我们可以减少对现有代码的修改,从而减小引入错误的风险,并提高系统的可维护性和可扩展性。在这个例子中,我们通过继承基本订单类来创建了一个新的在线购物订单类,并在该类中覆盖了基类的CalculateDiscount()方法,实现了在线购物订单特定的折扣计算逻辑。 阅读详情

1:什么是开放封闭原则

开放封闭原则(Open-Closed Principle):一个软件实体应当对扩展开放(open),则修改关闭(不修改原来的代码这就是closed)。在设计一个模块时,应当使得这个模块可以在不被修改的前提下被扩展(这就要求我们不能在一个类中写死所有的功能)。也就是说,应当可以在不必修改源代码的情况下修改这个模块的行为。设计的目的便在于面对需求的改变而保持系统的相对稳定,从而使得系统可以很容易的从一个版本升级到另一个版本,也许我们做一个项目不难,难就难在后期不断变态的需求上把你搞死,如果设计不好的话会大量修改原来的代码,这样会造成一个类中的代码巨大,而且还容易导致新的bug,

也许我们不能做到完全封闭,那我们就应该对那些变化封闭,那些变化隔离做出选择。我们做出选择,然后将那些无法封闭的变化抽象出来,进行隔离允许扩展,尽可能的减少系统的开发.当系统变化来临时,我们要及时的做出反应。我们并不害怕改变的到来。当变化到来时,我们首先需要做的不是修改代码,而是尽可能的将变化抽象出来进行隔离,然后进行扩展。面对需求的变化,对程序的修改应该是尽可能通过添加代码来实现,而不是通过修改代码来实现

这样文字讲解也许太抽象现在通过一个实例来演示下这个问题:


一个银行业务员有这些功能,

package com.zhimore.bank;
/**
 * 银行业务员
 * @author Adminis
 */
public class BankWorker {
	/**
	 * 存款
	 */
     public void saving(){
    	 System.out.println("进行存款操作");
     }
     /**
      * 取款
      */
     public void drawing(){
    	 System.out.println("进行 取款操作");
     }
     public void transfer(){
    	 System.out.println("进行转账操作");
     }
     /**
      * 基金申购
      */
     public void fundSubscription(){
    	 System.out.println("进行基金申购操作");
     }
}
package com.zhimore.bank;

public class MainClass {
    public static void main(String[] args) {
    	BankWorker bankWorker = new BankWorker();
    	bankWorker.saving();
    	
    	bankWorker.drawing();
    	bankWorker.fundSubscription();
    	bankWorker.transfer();
	}
}
打印的结果:

进行存款操作
进行 取款操作
进行基金申购操作
进行转账操作

也许你会说这样功能不是实现了么,感觉么么哒,但是如果后期经理说小周给这个银行业务员添加一个办理信用卡的功能,那你是不是又要到BankWorker类中去写个办理信用卡的方法用来实现这个功能呢?也许后期会有n个功能要添加,那你一直在原来的类中去写,你能保证不会出错,而且扩展性和维护性都很差,所以一个功能过来最好是别再之前的类中去添加新的功能了,这样就要求你开始设计的时候就要考虑后期的扩展,而且最好要做到不在原来的代码上做修改,这就是我们本博客要讲的原则 开放-封闭原则,就是对扩展开放,对修改关闭,怎么做到扩展和关闭呢?其实也不难,你只要把功能抽取出来,对后期的功能添加一个新的类去实现这样就不需要修改之前的代码,而且不容易出错,代码也清晰,

新的设计如下:


上面银行业务员仅仅是一个接口,下面各种办理都是一个个子类去实现

package com.zhimore.bank1;
/**
 * @author Adminis
 */
public interface BankWorker {
    public void operation();
}
我们把银行的各个业务抽取出来一个接口,

package com.zhimore.bank1;
/**
 * 负责取款操作的业务员
 * @author Adminis
 */
public class DrawingBankWorker implements BankWorker {
	@Override
	public void operation() {
		System.out.println("进行 取款操作");
	}
}

package com.zhimore.bank1;
/**
 * 存款业务员
 * @author Adminis
 */
public class SavingBankWorker implements BankWorker {
	@Override
	public void operation() {
		System.out.println("进行存款操作");
	}
}

package com.zhimore.bank1;
/**
 * 负责转账操作的业务员
 * @author Adminis
 */
public class TransferBankWorker implements BankWorker{
@Override
public void operation() {
System.out.println("进行转账操作");
}
}


package com.zhimore.bank1;

public class MainClass {
	public static void main(String[] args) {
		BankWorker bank1 = new SavingBankWorker();
		bank1.operation();
		
		BankWorker bank2 = new DrawingBankWorker();
		bank2.operation();
		
		BankWorker bank3 = new TransferBankWorker();
		bank3.operation();
	}
}
打印结果:

进行存款操作
进行 取款操作
进行转账操作


这样设计也实现了上述功能,但是扩展性更好,比如要添加某一个功能我们只需要添加一个类实现BankWorker接口就行,这样是不是做到了对外扩展,对内进行关闭,因为我们并没有修改原来的代码,而只是在原来的基础上添加了几个类,这就是扩展,

2:开放封闭原则的优越性

1.通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,是变化中的软件有一定的适应性和灵活性。
2.已有的软件模块,特别是最重要的抽象模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性


Jetson Nano(1)——笔记本电脑控制 笔记本电脑控制Jetson Nano没有显示屏如何控制Jetson Nano一、使用ssh客户端连接到Jetson Nano的命令端1.将电脑的网线口和jetson nano的网线口通过网线连接2.在控制面版中打开“更改配适器设置”3.查找jetson nano的ip地址4.利用putty链接二、远程桌面配置 没有显示屏如何控制Jetson Nano Jetson Nano相当于一个微型电脑,能快... 阅读详情

相关推荐

Qt快速读取Excel文件

网上很多读取方式都是如下形式,太慢了,打开文件+读取文件要6s以上,实在是受不了! QAxObject excel("Excel.Application"); excel.setProperty("Visible", false); QAxObject *work_books = excel.querySubObject("WorkBooks"); work_boo...

c+c++的博客 2万+

开放-封闭原则(The Open-Closed Principle)

开放-封闭原则(The Open-Closed Principle)

一朝风月 2644

ArcGIS中利用DEM数据生成地形图既视感的等高线;利用掩膜进行等高线注记;DEM的可视化表达总结

文章目录前言一、效果图展示二、地形(DEM)可视化表达1.一维可视化2.二维可视化2.三维可视化二、ArcGIS中利用DEM数据制作等高线2.三维可视化2.三维可视化2.三维可视化2.三维可视化二、ArcGIS中利用DEM数据制作等高线2.三维可视化2.三维可视化2.三维可视化总结 前言 最近老师布置作业:DEM的可视化表达。想做一个等高线地形图那样、看起来高级一点的等高线,可是我看网上大多数教程都只展示了【等值线】工具,做出来效果都一般。我自认为自己做出来的效果还可以,把步骤分享给大家。 一、

pink_pig__的博客 5万+

开放封闭原则(Open Closed Principle)

在面向对象的设计中有很多流行的思想,比如说 “所有的成员变量都应该设置为私有(Private)”,“要避免使用全局变量(Global Variables)”,“使用运行时类型识别(RTTI:Run Time Type Identification,例如 dynamic_cast)是危险的” 等等。那么,这些思想的源泉是什么?为什么它们要这样定义?这些思想总是正确的吗?本篇文章将介绍这些思想的基础:开放封闭原则(Open Closed Principle)。 Ivar Jacobson 曾说过 “所有系统在其

u010001360的博客 1420

密评实战:应用层数据安全防护全解析

本文从实战角度深度解析三级信息系统密评中应用层数据安全防护的核心要点。围绕身份鉴别、访问控制、数据传输与存储安全、不可否认性等关键环节,结合国密算法(SM2/SM3/SM4)与智能密码钥匙等合规技术,提供了从代码审查、日志分析到流量验证的全链路排查方法,助力构建真正符合密评标准的数据安全防线。

weixin_29291185的博客 460

Excel药品说明书数据库:从零开始搭建医药数据查询系统(附完整模板)

本文详细介绍了如何从零开始搭建Excel药品说明书数据库,提供完整的医药数据查询系统模板。涵盖数据库架构设计、数据清洗标准化、智能查询系统搭建及维护优化,帮助医药从业者高效管理药品信息,提升查询速度和准确性。

weixin_28327051的博客 234

一文搞懂开放封闭原则

软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。这意味着当需求发生变化时,我们应该能够在不修改原有代码的基础上,通过新增代码的方式来满足新的需求。

qq_39406460的博客 1169

使用mne包来对脑电数据进行预处理(一)

MNE(MNE-Python)是一个用于处理脑电(EEG)、磁图(MEG)和其他神经科学数据的Python库。它提供了丰富的功能,包括数据加载、预处理、分析和可视化,旨在帮助研究人员和神经科学家更轻松地进行脑电数据的处理和分析。在本文中,我们使用mne来对不同的格式的脑电数据集进行数据读取。

m0_71596228的博客 4303

面向对象设计原则(二):开放-封闭原则(OCP)

开放-封闭原则(Open-closed principle,OCP)也称开闭原则,是面向对象设计(OOD)中比较重要的一种,下面来总结开放-封闭原则的知识点,包括:1、什么是开放-封闭原则?2、为什么需要遵守开放-封闭原则?3、怎么做到开放-封闭原则?4、开放-封闭原则需要注意什么?

tjiyu的博客 4930

【DeepSeek+Office/WPS】智能办公新时代的全新利器

DeepSeek是一家专注于通用人工智能技术研发的中国科技公司,其核心产品DeepSeek-R1是一款开源的推理大模型,专注于复杂任务的高效处理,支持智能对话、文本生成、语义理解、计算推理、代码生成与补全等多种应用场景。作为国产、免费、开源且强大的AI平台,DeepSeek不仅致力于为终端用户提供高质量的智能服务,还为开发者提供了一整套完善的技术解决方案,帮助他们快速构建和部署自己的智能应用。

2303_77200324的博客 2791

世界职业院校技能大赛财经赛道项目参考逐字稿五

世界职业院校技能大赛财经赛道项目参考逐字稿五

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 132

设计模式原则之:开放封闭原则

这一讲,我们来看下一个设计原则:开放封闭原则。作为一名程序员,来了一个需求就要改一次代码,这种方式我们已经见怪不怪了,甚至已经变成了一种下意识的反应。修改也很容易,只要我们按照之前的惯例如法炮制就好了。这是一种不费脑子的做法,却伴随着长期的伤害。每人每次都只改了一点点,但是,经过长期积累,再来一个新的需求,改动量就要很大了。而在这个过程中,每个人都很无辜,因为每个人都只是遵照惯例在修改。但结果是,所有人都受到了伤害,代码越来越难以维护。既然“修改”会带来这么多问题,那我们可以不修改吗?

初念初恋的博客 765

prplOS组件流程梳理

本文梳理了prplOS系统中设备信息管理模块(deviceinfo-manager)的工作流程。该模块启动时通过/etc/init.d/deviceinfo-manager调用核心框架amxrt执行,主要功能包括收集设备信息、管理数据模型、初始化子系统等。系统采用ODL文件定义数据模型,通过解析器将配置文件转换为内存中的对象树。流程涉及命令行参数解析、ODL文件加载、后端模块扫描等核心步骤,最终构建出完整的数据模型供上层应用访问。整个架构体现了模块化设计思想,通过动态加载插件实现功能扩展。

四儿家的小祖宗的博客 1263

JAVA设计原则:开放封闭原则

开放封闭原则 开放封闭原则(Open-Closed Principle):一个软件实体应当对扩展开放,则修改关闭。在设计一个模块时,应当使得这个模块可以在不被修改的前提下被扩展。也就是说,应当可以在不必修改源代码的情况下修改这个模块的行为。设计的目的便在于面对需求的改变而保持系统的相对稳定,从而使得系统可以很容易的从一个版本升级到另一个版本。   一、怎么做到开放封闭原则 实际上,绝对封闭的系统是...

Derrick 929

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

面向对象设计原则详解:开放封闭原则

定义:软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改。对于扩展是开放的,对于更改是封闭的。关键是抽象,将一个功能的通用部分和实现细节部分清晰的分离开来。     这里要求我们写代码要有抽象的概念。什么是抽象?指由实体抽离出概念的思考过程。就是从众多的对象中抽离出共同的本质的特征。在写代码的过程中,需要抽象类的地方,只需要抓住这个类的本质功能,不要老想着它在这个工程中的具体功能。

杨友山 6317

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

面向对象设计原则之二:开放封闭原则

开放封闭原则(Open-Closed Principle OCP) Software entities(classes,modules,functions etc) should open for extension ,but close for modification.    什么意思呢?    所谓开放封闭原则就是软件实体应该对扩展开放,而对修改封闭。开放封闭原则是所有面向对象原则

悦然的博客 400

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

面向对象设计原则实践:之一.开放封闭原则

常用的面向对象设计原则包括7个,这些原则并不是孤立存在的,它们相互依赖,相互补充。 名称 易记符 设计原则及简介 实现关键 关系 重要性 开放封闭原则 开放闭合 程序对扩展是开放的,对修改是封装的。 即在不修...

北雨南萍 1012

vue-awesome-swiper组件设计原则:单一职责与开放封闭原则的应用

你是否在开发轮播组件时遇到过以下问题?组件功能臃肿导致维护困难、版本升级时API兼容性问题频发、无法灵活扩展新特性?本文将以vue-awesome-swiper组件为例,深入探讨单一职责原则(Single Responsibility Principle, SRP)和开放封闭原则(Open/Closed Principle, OCP)在前端组件设计中的应用,为你揭示如何构建高内聚、低耦合、易扩展的...

gitblog_01130的博客 301

设计原则之二:开放封闭原则(OCP)

内容待续……

哭着出生,笑着死去 206

《Android之大话设计模式》--设计原则 第三章:开放封闭原则 孙悟空任弼马温一职

应用场景举例:        孙悟空从东海龙宫拿到定海神针如意金箍棒后回到花果山,和自己的部下过着自由自在的生活。那只好景不长,因为他在地狱删除了自己和花果山所有猴子的名单,同时又拿走了定海神针,不久便被阎王和龙王告上了天庭。玉帝正要下旨去捉拿妖猴问罪。忙被龙王劝止,龙王说孙悟空神通广大,阎王也深表赞同。玉帝有些迟疑,问众仙该如何是好,太白金星说不如封他一个天宫中的官职去做,这样明为封官,实际

silvia0427的专栏 676

正确理解面向对象程序设计 中级篇(二)设计原则之OCP:开放封闭原则

OCP:开放封闭原则: 软件实体(类、模块、函数)应该是可以扩展的,但是不可修改。 前言 使用OCP是意图在软件设计阶段能够应对未来可能出现的需求变更。达成一种能够应对需求变更又不影响现有代码的设计结构。 需求变更时我们要变更什么? 在面向对象语言中模块以包的形式体现,函数以类方法的形式体现。所以我们要变更的是类和函数。OCP不允许修改。那么只剩下新增了。 如何通过新增进行修改? 使用抽象 类已经是对象的抽象了。我们还要再向上一层,创造类的抽象。 ...

艾克的博客 352
上一篇: android 自定义view实现流式布局
下一篇: android studio链接不上真机解决方案
zhoushenxian
博客等级 码龄12年 453粉丝 549原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值