java设计模式 开闭原则

news2024/11/23 23:42:09

        开闭原则(Open-Closed Principle,OCP)是面向对象设计中的一个重要原则,它指导着我们如何设计和组织代码,以便使系统在扩展性和可维护性方面更加优秀。

        开闭原则的定义是:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。简单来说,就是当需要对系统进行修改或扩展时,应该尽量通过添加新的代码来实现,而不是修改已有的代码。

        开闭原则的目标是使系统具有良好的可扩展性和可维护性。通过遵循开闭原则,我们可以减少对已有代码的修改,从而降低引入新错误的风险,提高代码的稳定性和可靠性。

        开闭原则的核心思想是通过抽象和多态来实现代码的可扩展性。具体来说,我们可以通过定义抽象的接口或基类,然后通过实现这些接口或继承这些基类来扩展系统的功能。这样,当需要新增功能时,只需要添加新的实现类或子类,而不需要修改已有的代码。

模拟场景:参考java设计模式2,开闭原则 - 知乎 (zhihu.com)

通过订阅哪吒专栏的场景说明一下。

1、普通用户,一般只能查阅哪吒的普通文章,并通过超链的形式时刻提醒着它们,要购买哪吒的付费专栏,付费知识就是香。

2、专属用户,通过购买专栏的形式查阅单一专栏的优质文章,并时刻提醒着,要购买其它专栏啊,毕竟学习才是王道。

3、VIP用户(订阅了哪吒的全部专栏),既可以看《Java基础教程系列》,也可以看《Spring Boot 进阶实战》,无推广,告别CRUD,进阶高级Java工程师,升职加薪,迎娶白富美。

1、定义接口


public interface IUserService {
    // 阅读文章
    void read();

    // 推广宣传
    void promote();
}

2、实现类,普通用户

/**
 * 普通用户
 */
public class GeneralUserServiceImpl implements IUserService {
    public void read() {
        System.out.println("可以查阅哪吒的普通文章");
    }

    public void promote() {
        System.out.println("并通过超链的形式时刻提醒着它们,要购买哪吒的付费专栏,付费知识就是香");
    }
}

3、实现类,专属用户

/**
 * 专属用户
 */
public class ExclusiveUserServiceImpl implements IUserService {
    public void read() {
        System.out.println("通过购买专栏的形式查阅单一专栏的优质文章");
    }

    public void promote() {
        System.out.println("并通过超链的形式时刻提醒着它们,购买哪吒的其它付费专栏,付费知识就是香");
    }
}

4、VIP用户

/**
 * VIP用户
 */
public class VipUserServiceImpl implements IUserService {
    public void read() {
        System.out.println("脚踩风火轮,手拿乾坤圈,学习哪吒优质文章,我命由我不由天。");
    }

    public void promote() {
        System.out.println("告别CRUD,进阶高级Java工程师,升职加薪,迎娶白富美");
    }
}

每种用户对应的阅读权限都有对应的实现类,不会相互干扰。当某一类用户需要添加新的权限或增加新的用户类别时,操作起来也非常方便。比如上文中提到的逢年过节的要给哪吒VIP发放福利,比如赠送精美图书,赠送精美周边等。

通过利用单一职责原则优化后,现在每个类只负责自己的用户行为,后续无论扩展新的功能还是增加用户种类,都可以很方便的开发和维护。

在项目开发的过程中,尽可能保证接口的定义、类的实现保持单一职责,对项目后期的迭代和维护会有很大的帮助。

那么此时,如果想对VIP用户的权益进行升级,需要扩展,接下来就通过这个场景来体现开闭原则。

总结:

开闭原则的优点有以下几个方面:

1. 可扩展性:通过遵循开闭原则,系统可以方便地进行功能扩展,只需要添加新的代码而不需要修改已有的代码。

2. 可维护性:由于开闭原则减少了对已有代码的修改,系统的维护成本也相应降低。

3. 可复用性:通过抽象和多态的使用,可以使代码更加通用和可复用。

4. 可测试性:由于开闭原则使系统的功能模块化,可以更方便地进行单元测试和集成测试。

要遵循开闭原则,我们可以采取以下几个策略:

1. 使用抽象类或接口定义系统的核心功能,通过实现这些抽象类或接口来扩展功能。

2. 封装变化:将可能发生变化的代码封装起来,使其与稳定的代码分离,从而降低变化的影响范围。

3. 使用设计模式:设计模式中的很多模式都是为了实现开闭原则而存在的,比如策略模式、观察者模式等。

        开闭原则是面向对象设计中的一个重要原则,它指导着我们如何设计和组织代码,以便使系统具有良好的可扩展性和可维护性。通过遵循开闭原则,我们可以减少对已有代码的修改,降低引入新错误的风险,提高代码的稳定性和可靠性。

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

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

相关文章

json处理由fastjson换jackjson

fastjson没有jackjson稳定,所以换成jackjson来处理对象转json和json转对象问题。 首先下载jackjson包,三个都要引用 然后修改实现类 package JRT.Core.Util;import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.ja…

【精选】Spring整合MyBatis,Junit 及Spring 事务Spring AOP面向切面详解

Spring整合MyBatis 搭建环境 我们知道使用MyBatis时需要写大量创建SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等对象的代码,而Spring的作用是帮助我们创建和管理对象,所以我们可以使用Spring整合MyBatis,简化MyBatis开发。 …

真空工艺腔内潮湿有什么危害?

在半导体制程中,真空工艺腔被广泛使用。薄膜沉积,干法刻蚀,光刻,退火,离子注入等工序均需要在相应的真空腔室中完成相应制程。真空工艺腔在半导体制程中起着至关重要的作用,它能够提供一个高度控制的环境&a…

再探Java集合系列—ArrayList

适用于什么场景? 检索比较多的场景,例如学生成绩管理系统,老师对学生的成绩进行排名或查询操作 ArrayList有哪些特点? 1、ArrayList集合底层采用了数组数据结构,是Object类型 2、动态数组。ArrayList的默认初始容量…

【模电】单结晶体管

单结晶体管 单结晶体管的结构和等效电路工作原理和特性曲线应用举例 单结晶体管的结构和等效电路 在一个低掺杂的N型硅棒上利用扩散工艺形成一个高掺杂P区,在P区与N区接触面形成PN结,就构成单结晶体管(UJT)。其结构示意图如下图所示。   P型半导体引出…

【SK-learn学习】1.16 概率校准

一、说明 概率校准,指的是对于分类器而言,对应多种类别,概率最大就将样本归入,这个事实没有考虑置信度的问题。sklearn的calibration就是指的这种情形,参考本文。 二、关于sklearn.calibration的概念 执行分类时&#…

Java如何有效避免空指针

shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 hello,伙伴们,shigen又来了,这篇稿子是周末的时候写出来的。今天的话题是&a…

Linux处理文本常见命令

目录 1 vim 2 echo 3 tee 4 cat 1 vim 编辑文本类的内容,使用的时候 vim [文件名],比如 vim A.txt 进入vim界面后,按i可以开启编辑模式,按ESC可以关闭编辑模式,关闭编辑模式后:wq!保存并退出 2 echo ech…

SSM项目管理系统开发oracle10g数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM项目管理系统是一套完善的信息系统,结合springMVC框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统 主要采用B/S模式开…

【九】linux下部署frp客户端服务端实践

linux下部署frp客户端服务端实践 简介: 今天有一个这样的需求,部署在公司内部局域网虚拟机上的服务需要在外网能够访问到,这不就是内网穿透的需求吗,之前通过路由器实现过,现在公司这块路由器不具备这个功能了&#x…

科东快讯 | Intewell鸿道工业操作系统亮相丝路峰会暨中国新工业博览会

近日,第十六届中国工业论坛丝路峰会暨中国新工业博览会在陕西西安临空会展中心圆满落幕! 峰会围绕“十四五”工业经济高质量发展的新使命、新担当,以“新工业新动能新格局”为主题,聚焦新兴工业领域,突出新工业产业集…

想学计算机视觉入门的可以看过来了

文章写了有一段时间了,期间不少小伙伴来咨询如何自学入门AI,或者咨询一些AI算法。 90%的问题我都回复了,但有时确实因为太忙,没顾得过来。 在这个过程中,我发现很多小伙伴问的问题都类似:比如如何入门计算…

一名技术Leader应该是创作者

今天看了一本书叫做《黑客与画家》。它里面提到一个很重要的概念就是黑客(优秀的程序员)是一名建筑师,而不是一名工程师。 传统的主管和互联网的Leader 这两者有什么区别呢?关键点在于建筑师是思考做什么,而工程师是…

浅析函数防抖节流

防抖和节流都是前端开发中常用的优化性能的技术。 一、定义 防抖: 防抖指的是在事件触发后,在规定的时间内若再次触发,则重新计时,直到规定时间内没有再次触发事件,才执行事件处理。这样可以避免在短时间内频繁地触发…

信创实时云渲染,Paraverse平行云LarkXR适配多个国产操作系统

近日,Paraverse平行云企业级实时云渲染解决方案LarkXR,现已全面支持国产信创技术路线。这一进展不仅是3D/XR领域国产软件领域在操作系统兼容的一次进步,也是对国家自主创新战略的有力响应,展示了Paraverse平行云在推动国产软件发展…

从戴森发明的“球轮手推车”看专利

今天跟大家分享一个特别有意思的专利,那就是戴森发明的球状轮子的手推车。 相信戴森这个品牌很多人都听过,大家熟悉的应该是戴森吹风机和戴森吸尘器。这两个目前是市场上比较高端的家用设备。 很多人也正是因为这些家用设备了解到戴森这个人&#xff0…

第二十章 -----多线程

20.1 线程简介 计算机完全可以将多种活动同时进行,这种思想在java中称为并发,将并发完成的每一件事情称为线程 线程的特点: 极小的单位 一个进程有很多个线程 线程共享进程的资源 20.2 创建线程 20.2.1 继承Thread类 Thread类是Java.l…

EC 404 information economics

EC 404 information economics WeChat: zh6-86

九、LuaTable(表)

文章目录 一、定义二、Table(表)的构造三、Table 操作(一)Table连接(二)插入和移除(三)Table 排序(四)Table 最大值 一、定义 table 是 Lua 的一种数据结构用来帮助我们创建不同的数…

MySQL -DDL 及表类型

DDL 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification:[DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1.CHARACTER SET&#xff1a…