设计模式—开闭原则

1.背景

伯特兰·迈耶一般被认为是最早提出开闭原则这一术语的人,在他1988年发行的《面向对象软件构造》中给出。这一想法认为一旦完成,一个类的实现只应该因错误而修改,新的或者改变的特性应该通过新建不同的类实现。新建的类可以通过继承的方式来重用原类的代码。衍生的子类可以或不可以拥有和原类相同的接口。
梅耶的定义提倡实现继承。具体实现可以通过继承方式来重用,但是接口规格不必如此。已存在的实现对于修改是封闭的,但是新的实现不必实现原有的接口。
在这里插入图片描述

2.概念

开闭原则,在面向对象编程领域中,规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为;它是最基础的设计原则,指导我们建立稳定、灵活的系统。
通俗的讲:
1.对扩展开放,对修改关闭;
2.使程序更易于扩展、维护和升级;

在这里插入图片描述

3.开发中如何遵守

系统中的模块、类、方法对他们的提供者应该是开放的,提供者可以对系统进行扩展新的功能。
系统中的模块、类、方法对他们的使用者应该是关闭的,使用者使用这些功能时,不会因为提供方新增了功能而导致使用者也进行相关的修改。
想要达到遵守开闭原则的效果,我们在程序开发时需要使用接口和抽象类。
因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。

4.案例

我们通过一个绘图的功能来演示如何遵守开闭原则;
不遵守开闭原则的代码:

public class DrawShape {
    // TODO 不好的代码
    public void drawView(int type){
        if (1== type){
            System.out.println("圆形");
        }else if (2==type){
            System.out.println("矩形");
        }
    }
}
public class Draw {
    public static void main(String[] args) {
        DrawShape drawShape = new DrawShape();
        // TODO 不好的代码
        // 绘制圆形
        drawShape.drawView(1);
        // 绘制矩形
        drawShape.drawView(2);
    }
}

遵守开闭原则的代码:

/**
 * 画图基础类
 */
public abstract class BaseShape {
    // 画图
    public abstract void drawView();
}

/**
 * 圆形
 */
public class Circle extends BaseShape {
    public void drawView() {
        System.out.println("圆形");
    }
}

/**
 * 矩形
 */
public class Rectangle extends BaseShape {
    public void drawView() {
        System.out.println("矩形");
    }
}

/**
 * 绘制
 */
public class DrawShape {
    public void drawView(BaseShape draw){
        // ... 其他处理
        draw.drawView();
    }
}

public class Draw {
    public static void main(String[] args) {
        DrawShape drawShape = new DrawShape();
        // 绘制圆形
        drawShape.drawView(new Circle());
        // 绘制矩形
        drawShape.drawView(new Rectangle());
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud 版本升级遇坑记:OpenFeignClient与Gateway的恩怨情仇

Spring Cloud 版本升级遇坑记:OpenFeignClient与Gateway的恩怨情仇 近日,在对项目中的 Spring Boot、Spring Cloud 以及 Spring Cloud Alibaba 进行版本升级时,遭遇了一个令人头疼的问题:Spring Cloud Gateway 在运行时一直卡住&a…

Python web自动化测试 —— 文件上传

​文件上传三种方式: (一)查看元素标签,如果是input,则可以参照文本框输入的形式进行文件上传 方法:和用户输入是一样的,使用send_keys 步骤:1、找到定位元素,2&#…

CV计算机视觉每日开源代码Paper with code速览-2023.11.20

点击CV计算机视觉,关注更多CV干货 论文已打包,点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【人脸识别】FRCSyn Challenge at WACV 2024:Face Recognition Challenge in the Era of Synthetic Data 论文地址:https://arxi…

centos系统下,docker安装sqlserver并用本地Navicat连接

文章目录 一,centos下安装docker二,docker安装sqlserver20192.1 安装遇到的问题2.1.1 修改用户名进不去数据库2.1.2 安装2022版的sqlserver发现启动失败 三,Navicat连接centos下的sqlserver3.1 下载ODBC Driver 参考微软网址: 使…

SUSE 15.2升级Openssh9.5

SUSE 15.2升级Openssh9.5 公司有部分SAP的机器用的SUSE,懒得弄rpm包了.直接编译安装 1. 添加阿里云源 zypper addrepo -f http://mirrors.aliyun.com/opensuse/distribution/leap/15.2/repo/oss/ openSUSE-15.2-Oss zypper addrepo -f http://mirrors.aliyun.com/opensuse/d…

Vatee万腾科技新高峰:Vatee前瞻性创新的数字化之力

Vatee万腾科技,一家以前瞻性创新为核心驱动力的数字化引领者,正迈向新的高峰。其在科技领域的卓越表现不仅体现在技术实力上,更展现在对未来的深刻洞察和独到思考上。 在Vatee的科技舞台上,前瞻性创新如一道独特的光芒&#xff0c…

Visual Components软件典型功能描述 衡祖仿真

1、即点即用,即插即用 vc提供大量的组件模块,组件都已经赋子行为和渲染,看起来复杂的模拟场景,可以通过简单拖拉组合,即可成为一条运动的仿真。节省更多的时间,让布局更灵动。 2、PLC功能 过去,PLC程序的…

视频服务网关的三大部署(三)

视频网关是软硬一体的一款产品,可提供多协议(RTSP/ONVIF/GB28181/海康ISUP/EHOME/大华、海康SDK等)的设备视频接入、采集、处理、存储和分发等服务, 配合视频网关云管理平台,可广泛应用于安防监控、智能检测、智慧园区…

2023年面试测试工程师一般问什么问题?

面试和项目一起,是自学路上的两大拦路虎。面试测试工程师一般会被问什么问题,总结下来一般是下面这4类: 1.做好自我介绍 2.项目相关问题 3.技术相关问题 4.人事相关问题 接下来,主要从以上四个方向分别展开介绍。为了让大家更有获…

现货黄金区间交易的两个要点

在现货黄金市场中,我们常碰到横盘区间行情。有区间,就终究会出现突破,因为金价不可能缺乏方向而一直在区间内运行。那既然要突破,我们又应当如何应对和交易呢?下面我们就来讨论一下。 切忌在突破发生时马上跟随突破方向…

[HCIE] IPSec-VPN (手工模式)

概念: A. IPSec:是对IP的安全性补充,工作在IP层,为IP网络通信提供安全服务。 B.安全联盟SA:是通信对等体之间对某些要素的协定。 C. IPSec安全联盟简称 IPSec SA.通常成对建立(inbound和outbound&#x…

vue怎么实现国际化? vue-i18n 插件实现国际化,支持切换不同语言

依赖的文档开始 | Vue I18n 一、安装 npm install vue-i18n 如果在一个模块系统中使用它,你必须通过 Vue.use() 明确地安装 vue-i18n: import Vue from vue import VueI18n from vue-i18nVue.use(VueI18n)二、使用 在 src 下创建 lang 文件夹 1.准…

探索移动端可能性:Capacitor5.5.1和vue2在Android studio中精细融合

介绍: 移动应用开发是日益复杂的任务,本文将带领您深入探索如何无缝集成Capacitor5.5.1、Vue2和Android Studio,以加速您的开发流程Capacitor 是一个用于构建跨平台移动应用程序的开源框架。Vue 是一个流行的 JavaScript 框架,用…

销售管理系统怎么选择?

销售管理系统能够帮助企业更好的了解客户、洞察市场趋势是企业管理中常见的工具,如何选择销售管理系统?可以考察销售管理系统功能是否完整、稳定性以及CRM系统是否易上手。 1.功能是否完整 功能完整是销售管理系统的首要条件,例如缺少营销自…

虚幻学习笔记—给UI添加动画

一、前言 本文所使用的虚幻版本为5.3.2,之前工作都是用unity,做这类效果用的最多的是一个DoTween的插件,在虚幻中都内置集成了这这种效果制作。 图1.1 UI动画 二、过程 1、首先,在诸如按钮、图像等可交互控件中选中,如…

【开源】基于Vue.js的城市桥梁道路管理系统的设计和实现

项目编号: S 025 ,文末获取源码。 \color{red}{项目编号:S025,文末获取源码。} 项目编号:S025,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥…

单片DC-DC变换集成电路芯片B34063,可兼容型号MC34063A。工作电压范围宽。静态电流小,具有输出电流限制功能输出电流保护功能

B34063为一单片DC-DC变换集成电路,内含温度补偿的参考电压源(1.25V)、比较器、能有效限制电流及控制工作周期的振荡器,驱动器及大电流输出开关管等,外配少量元件,就能组成升压、降压及电压反转型DC-DC变换器。 主要特点: ● 工作…

web前端开发基础------外边距折叠现象

引言 在设置样式时,需要遵循先整体再细节,先通用样式再特殊样式的顺序进行设置 一,什么是外边距折叠现象呢? 外边距折叠 定义: 外边距折叠是指相邻的两个或者多个外边距(margin)在垂直方向会合并…

如何为你的味蕾选择最完美的白葡萄酒

每一种白葡萄酒都有独特的味道和气味,如何选择一款你喜欢的口味的葡萄酒呢?每一种独特的白葡萄酒产品都使用了非常不同的发酵过程和葡萄种类,以达到它们所熟知的独特味道和风味。 来自云仓酒庄品牌雷盛红酒分享长相思是最具绿色口感的白葡萄…

Java零基础——SpringMVC篇

1.SpringMVC介绍 SpringMVC是Spring框架中的一个组件,是一个轻量级的web的MVC框架,充当controller,其本质就是一个Servlet。 1.1 传统Servlet的不足 每个请求,都需要定义一个Servlet。虽然可以在service方法中,根据业务标识进行…