六大设计原则--开闭原则

2023-11-19

定义

software entities like classes, modules and functions should be open for extension but closed for modifications.
一个软件实体应该对扩展开放,对修改关闭。

什么是开闭原则

闭原则的定义已经非常明确告诉我们:软件实体应该对扩展开放,对修改关闭,其含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。那什么又是软件实体呢?软实体包括以下部分:

项目或软件产品中按照一个逻辑规则划分的模块
抽象或类
方法

我们思考这样一个问题:一个软件产品只要在生命期内,都会发生变化,变化既然是一个既定的事实,我们就应该在设计时候尽量适应这些变化,以提高项目的稳定性和灵活性,真正实现“拥抱变化” ,开闭原则告诉我们通过尽量通过扩展软件实体的行为来实现变化,而不通过修改来已有的代码来完成变化,它是为软件实体的未来事件而制定的对现行开发设计进行约束的一个原则,我们举例什么是开闭原则,以书店销售书籍为例,类图如下:
这里写图片描述

IBook 是定义了数据的三个属性:名称、价格和作者,小说类 NovelBook 是一个具体的实现类,所有小说书籍的总称,BookStore 指的是书店,我们先来看 IBook接口:

public interface IBook { 
    //书籍有名称 
    public String getName(); 

    //书籍有售价 
    public int getPrice(); 

    //书籍有作者 
    public String getAuthor(); 
} 

小说书籍的源代码如下:

public class NovelBook implements IBook {
    
    //书籍名称 
    private String name; 

    //书籍的价格 
    private int price; 

    //书籍的作者 
    private String author; 

    //通过构造函数传递书籍数据 
    public NovelBook(String _name,int _price,String _author){ 
        this.name = _name; 
        this.price = _price; 
        this.author = _author; 
    } 

    //获得作者是谁 
    public String getAuthor() { 
        return this.author; 
    } 

    //书籍叫什么名字 
    public String getName() { 
        return this.name; 
    } 

    //获得书籍的价格 
    public int getPrice() {
        return this.price; 
    } 

} 

然后我们看书店是怎么销售书籍的:

public class BookStore { 
    private final static ArrayList<IBook> bookList = new ArrayList<IBook>(); 

    //静态模块初始化,项目中一般是从持久层初始化产生 
    static{ 
        bookList.add(new NovelBook("天龙八部",3200,"金庸")); 
        bookList.add(new NovelBook("巴黎圣母院",5600,"雨果")); 
        bookList.add(new NovelBook("悲惨世界",3500,"雨果")); 
        bookList.add(new NovelBook("金瓶梅",4300,"兰陵笑笑生")); 
    } 

    //模拟书店买书 
    public static void main(String[] args) { 
        NumberFormat formatter = NumberFormat.getCurrencyInstance(); 
        formatter.setMaximumFractionDigits(2); 
        System.out.println("------------书店买出去的书籍记录如下:---------------------"); 
        for(IBook book:bookList){ 
            System.out.println("书籍名称:" + book.getName()+"\t书籍作者:" + 
            book.getAuthor()+  "\t书籍价格:"  +  formatter.format(book.getPrice()/100.0)+"元"); 
        } 
    } 
} 

注意,我们在 BookStore 中声明了一个静态模块,实现了数据的初始化,这部分应该是从持久层产生的,由持久层工具进行管理。运行结果如下:

------------书店买出去的书籍记录如下:--------------------
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

六大设计原则--开闭原则 的相关文章

  • QGis二次开发 -- 源码编译终极篇

    由于是开源软件 QGis版本迭代比较快 在保持long term release版本的基础上 每个月都会有一个monthly release的新版本发布 源码工程变化快速 给想要上手编译开发的新人朋友带来了一些困惑 我之前分别写过QGis1

随机推荐

  • pytorch crossentropy为nan

    pytorch crossentropy为nan 交叉熵损失函数的具体为 loss x ln z 1 x ln 1 z z softmax pred x 这样当z为0 0时会出现loss为nan的情况 本人的具体原因 网络中用了MultiH
  • nginx启动、关闭、重启及常用的命令

    转自 https blog csdn net veryisjava article details 72917894 nginx常用命令 启动 cd usr local nginx sbin nginx nginx服务启动后默认的进程号会放
  • Error creating bean with name ‘com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration‘:

    报错图 原因分析 与MybatisPlusProperties的配置有关 该配置用于配置MyBatis Plus的全局设置 BindException表示在将mybatis plus global config db config前缀下的属
  • 凛冬已至 冰凌垂挂 岁末年初

    时光荏苒 岁月蹉跎 时间一分一秒从我们身边流过 岁月的脚步声也是越来越小 还没来得及跟眼前的2022挥手道别 2023已经出现在我们的眼前向我们问好 2023 就是新的一年 总会给我们带来无数的幻想和憧憬 虽然现在的我还没有一个真正的新年
  • QT基础学习(12)---事件过滤

    文章目录 事件过滤 一 事件过滤 实现该功能的方法就是在目标部件 自定义的图片显示部件 上注册事件过滤器 此时的事件过滤器就是我们所说的监视对象 完成这些步骤之后 当目标部件有事件产生后 首先会传递给监视对象 事件过滤器 进行处理而不是该事
  • 华为OD机试 - 猜字谜(Java)

    题目描述 小王设计了一个简单的猜字谜游戏 游戏的谜面是一个错误的单词 比如nesw 玩家需要猜出谜底库中正确的单词 猜中的要求如下 对于某个谜面和谜底单词 满足下面任一条件都表示猜中 变换顺序以后一样的 比如通过变换w和e的顺序 nwes
  • Kibana报错:Kibana server is not ready yet解决方法

    环境及版本 elasticsearch和kibana均为包安装的7 6 2 系统为unbutu22 04 1 部署完后访问kibana的web界面 出现kibana server is not ready yet 遇到这个问题后也是搜索了一
  • python注意事项

    python注意事项 1 缩进问题 每一个缩进都可能会导致有bug 因此要格外注意缩进 对齐 空格问题 尤其是循环体下的空格 一定要对齐 一般是缩进4格 2 标点符号的使用小结 逗号后面要有空格 冒号也是 等号前后都要有空格 3 字符串使用
  • MBA-day31 绝对值的几何意义

    绝对值的几何意义 1 x 2 x 4 由图可知 x 有 3 处取值区间 x gt 2 无最大值 x gt 4 无最大值 2 lt x lt 4 当x取值为 2和4时 存在几何意义中的最小值为 6 2 x 2 x 4 3 是否有根 由题1中
  • JAVAWEB编程题

    1 登陆验证代码
  • 人工智能大模型加速数据库存储模型发展 行列混合存储下的破局

    数据存储模型 专栏内容 postgresql内核源码分析 手写数据库toadb 并发编程 toadb开源库 个人主页 我的主页 座右铭 天行健 君子以自强不息 地势坤 君子以厚德载物 概述 在数据库的发展过程中 关系型数据库是一个里程碑式的
  • STL标准模板库学习笔记三(STL哈希容器)

    关联式容器 排序 的底层实现采用的树存储结构 更确切的说是红黑树结构 无序容器 哈希 的底层实现采用的是哈希表的存储结构 基于底层实现采用了不同的数据结构 因此和关联式容器相比 无序容器具有以下 2 个特点 无序容器内部存储的键值对是无序的
  • 欢迎访问阿里云Go Module代理仓库服务

    简介 go module公共代理仓库 代理并缓存go模块 你可以利用该代理来避免DNS污染导致的模块拉取缓慢或失败的问题 加速你的构建 地址 https mirrors aliyun com goproxy 使用帮助 1 使用go1 11以
  • leetcode刷题__删除有序数组中的重复项

    文章目录 题目描述 Java解决方法 题目描述 Java解决方法 class Solution public int removeDuplicates int nums int len nums length if len 0 return
  • Day81-爱心代码音乐版

    项目地址 截止到2023 9月有效 点击跳转 先看效果 素材来自网络 自己加了播放音乐的效果 直接上代码
  • 快速排序算法及其改进算法实现

    快速排序算法不稳定 快速排序算法在大多数的计算机上运行得都比其他排序算法快 而且排序算法消耗资源少 就平均时间而言快排是所有内部排序中最好的一个 对于已经排好的数组 最速排序有最坏时间复杂度为o n 2 当数组长度很小时 快排往往比其他排序
  • 【openGL2021版】链接FBX模型库

    openGL2021版 链接FBX模型库 大家好 我是Lampard猿奋 欢迎来到船新的openGL基础系列的博客 今天主要实现的是链接FBX模型第三方库 一 demo回顾 上周我已经实现了粒子系统 可以看到场景中已经存在着像萤火虫一样的闪
  • Wsl 开发环境配置

    Apt换源 切换清华源 sudo sed i s http archive ubuntu com https mirrors tuna tsinghua edu cn g etc apt sources list sudo sed i s
  • 图文详解 排序算法对比以及能解决的问题

    我们会使用的排序算法 总结源自 极客时间 王争老师 地址 https time geekbang org column intro 126 能看到所有的算法和数据结构的网站 https visualgo net en 这里是关于排序算法的链
  • 六大设计原则--开闭原则

    定义 software entities like classes modules and functions should be open for extension but closed for modifications 一个软件实体