1_开闭原则(Open Closed Principle)

开闭原则(Open Closed Principle)

1.概念

开闭原则(Open-Closed Principle)是指一个软件实体如类、模块和函数应该对扩展开放, 对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节

2.案例演示与讲解

创建一个课程接口
public interface ICourse {
    Integer getId();
    String getName();
    Double getPrice();
}
创建一个课程的具体实现类
public class Course implements ICourse{
    private Integer id;
    private String name;
    private Double price;

    public JavaCourse(Integer id, String name, Double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public Integer getId() {
        return this.id;
    }

    public String getName() {
        return this.name;
    }

    public Double getPrice() {
        return this.price;
    }
}

创建一个课程具体细节类(Java课程实现)来实现逻辑处理
public class JavaDiscountCourse extends Course {
    public JavaDiscountCourse(Integer id, String name, Double price) {
        super(id, name, price);
    }
    //假设双12活动,java课程打6折优惠逻辑处理
    public Double getDiscountPrice(){
        return super.getPrice() * 0.6;
    }
}

public class VueDiscountCourse extends Course {
    public JavaDiscountCourse(Integer id, String name, Double price) {
        super(id, name, price);
    }
    //假设双12活动,vue课程打7折优惠逻辑处理
    public Double getDiscountPrice(){
        return super.getPrice() * 0.7;
    }
}

调用类实现功能
public class OpenCloseTest {
    public static void main(String[] args) {
        //创建一个java课程
        ICourse iCourse = new JavaDiscountCourse(1,"Java架构",11800D);
        JavaDiscountCourse discountCourse = (JavaDiscountCourse)iCourse;
        System.out.println(
            "课程ID:" + discountCourse.getId() + 
            "\n课程标题:《" +  discountCourse.getName() + "》" 
            +"\n原价:" + discountCourse.getPrice() 
            + "\n售价:" + discountCourse.getDiscountPrice()
        );
        
        //创建一个vue课程
        ICourse iCourse = new VueDiscountCourse(1,"vue课程",11800D);
        VueDiscountCourse discountCourse = (VueDiscountCourse)iCourse;
        System.out.println(
            "课程ID:" + discountCourse.getId() + 
            "\n课程标题:《" +  discountCourse.getName() + "》" 
            +"\n原价:" + discountCourse.getPrice() 
            + "\n售价:" + discountCourse.getDiscountPrice()
        );
    }
}

执行结果:
在这里插入图片描述

3.开闭原则类图:

在这里插入图片描述

4.开闭原则类图概念理解

创建一个接口和实现中抽象方法和实现,保持结构不变关闭的修改

如果我们对实现类中的功能不满足,可以创建一个类继承实现类来扩展功能满足需要,应该对扩展开放
java 代码实现

public interface  Book{
    public String getName();//获取书名
    public double getPrice(); //获取价格
}
public class BookeImp implements Book {
    @Override
    public String getName() {
        return "书";
    }

    @Override
    public double getPrice() {
        return 10.0;
    }
}
public class JavaBook extends  BookeImp {
    public String getName() {
        return "Java书";
    }
    public double getPrice() {
        return 100.0;
    }
}
public class Use {
    public static void main(String[] args) {
        //需求打印通用书名和价格
        Booke book = new BookeImp();
        System.out.println(book.getName());
        System.out.println(book.getPrice());
        //修改需求打印java书名和价格,保持原有抽象类和现实的结构修改关闭,扩展新的需求功能
        Booke javaBook = new JavaBook();
        System.out.println(javaBook.getName());
        System.out.println(javaBook.getPrice());
    }
}

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

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

相关文章

python总结高阶-异常处理机制

文章目录 异常是什么?try和except结构try...一个except结构try...多个except结构try...except...else结构try...except...finally结构return语句和异常处理问题 常见异常常见异常的解决SyntaxError :语法错误NameError :尝试访问一个没有申明…

算法第十二天-矩形区域不超过K的最大数值和

矩形区域不超过K的最大数值和 题目要求 解题思路 来自[宫水三叶] 从题面来看显然是一道[二维前缀和]的题目。本题预处理前缀和的复杂度为O(m* n) 搜索所有子矩阵需要枚举[矩形左上角]和[矩形右下角],复杂度是 O ( m 2 ∗ n 2 ) O(m^2 * n^2) O(m2∗n2)&#xff0c…

如何安装 Python

1.打开浏览器 输入网址 :www.python.org ​ 2.根据电脑系统配置进行下载 ​ 3.确定电脑系统属性,此处我们以win10的64位操作系统为例 ​ 4.安装python 3.6.3 双击下载的安装包 python-3.6.3.exe 注意要勾选:Add Python 3.6 to PATH 点击 Customize…

听GPT 讲Rust源代码--compiler(27)

File: rust/compiler/rustc_mir_build/src/build/expr/as_place.rs 在Rust编译器的源代码中,文件rust/compiler/rustc_mir_build/src/build/expr/as_place.rs的作用是用于处理表达式的转换为L-value的过程。L-value是指那些可接受赋值操作的表达式,如变量…

企业Aspera替代方案有哪些推荐

随着企业数据量的不断增加,数据传输和共享成为了一个重要的问题。Aspera是一款高性能、低延迟的数据传输工具,但是它并不是万能的,随着数据量的不断增大,也有一些企业需要寻找Aspera的替代方案。本文将介绍三种常用的企业Aspera替…

复旦MBA科创青干营(二期):探索合肥科创企业的创新之路

11月18日-19日,复旦MBA科创青干营二期学生开启了整合实践活动的第三次企业参访,前往位于合肥的蔚来第二先进制造基地、安徽万邦医药科技股份有限公司和合肥国轩高科动力能源有限公司,在学术导师和科创企业家“双导师”的指导下,深…

近屿智能OJAC带您从0到1全方位深度学习AI大模型,星辰大海和你开创!

Look!👀我们的大模型商业化落地产品📖更多AI资讯请👉🏾关注Free三天集训营助教在线为您火热答疑👩🏼‍🏫 在这个信息爆炸的数字时代,你是否也想掌握那种像魔法一样的AI技…

Git - 强制替换覆盖 master 分支解决方案

问题描述 在版本迭代中,通常会保持一个主分支 master,及多个 dev 分支,但是因为 dev 分支的开发周期过长,迭代太多而没有及时维护 master ,导致后来发版上线的大部分代码都在 dev 分支上,如果将代码在 mas…

【Python学习】Python学习4-运算符

目录 【Python学习】Python学习4-运算符 前言算术运算符比较(关系)运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级参考 文章所属专区 Python学习 前言 本章节主要说明Python的运算符。主要有 算术运算符 比较(关系&…

MYSQL - SQL优化

插入数据优化 小批量数据 批量插入 最好插入500-1000条比较好 手动提交事务 主键顺序插入 大批量插入数据 主键优化 页分裂 页合并 主键优化设计原则 order by优化 group by优化 limit优化 count优化 count(1)里面不一定必须1,数字都可以 update优化 更新字…

Ubuntu同步两个剪切板

众所周知,ubuntu系统中有两套剪切板。第一个剪切板是用鼠标操作,鼠标选中则复制,点击鼠标中键则粘贴(这个剪切板通常叫做——选择缓冲区)。第二个剪切板则是真正的剪切板,使用ctrlc(在终端中默认…

响应式开发

响应式开发的原理Bootstrap前端开发框架Bootstrap栅格系统阿里百秀首页案例 响应式开发原理 1 响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。 2 在不同屏幕下,通过媒体查询来改变这个布局容器的大小,再改变里面子元素的排…

JDK 11:崭新特性解析

JDK 11:崭新特性解析 JDK 11:崭新特性解析1. HTTP Client(标准化)示例代码 2. 局部变量类型推断的扩展示例代码 3. 新的字符串方法示例代码 4. 动态类文件常量示例代码 5. Epsilon 垃圾收集器使用方式 结语 JDK 11:崭新…

LeetCode-有效的字母异位词(242)

题目描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 思路: 这题还是比较简单的,首先将两个字符…

Transformer 的双向编码器表示 (BERT)

一、说明 本文介绍语言句法中,最可能的单词填空在self-attention的表现形式,以及内部原理的介绍。 二、关于本文概述 在我之前的博客中,我们研究了关于生成式预训练 Transformer 的完整概述,关于生成式预训练 Transformer (GPT) 的…

Mybatis分页插件PageHelper的配置和使用

文章目录 每页10条记录,取第一页,返回的是前10条记录每页10条记录,取第二页,返回的是第11条记录,到第20条记录, MySQL对分页的支持 简单来说MySQL对分页的支持是通过limit子句。请看下面的例子。 limit关键…

VCG 点到平面的投影点

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 假设给定的平面为 a x + b y + c z + 1 = 0 ax+by+cz+1=0

2024年【烟花爆竹经营单位主要负责人】考试题及烟花爆竹经营单位主要负责人考试资料

题库来源:安全生产模拟考试一点通公众号小程序 2024年【烟花爆竹经营单位主要负责人】考试题及烟花爆竹经营单位主要负责人考试资料,包含烟花爆竹经营单位主要负责人考试题答案和解析及烟花爆竹经营单位主要负责人考试资料练习。安全生产模拟考试一点通…

OpenCV-Python(25):Hough直线变换

目标 理解霍夫变换的概念学习如何在一张图片中检测直线学习函数cv2.HoughLines()和cv2.HoughLinesP() 原理 霍夫变换在检测各种形状的的技术中非常流行。如果你要检测的形状可以用数学表达式写出来,你就可以是使用霍夫变换检测它。即使检测的形状存在一点破坏或者…

【数据库】聊聊常见的索引优化-上

数据库对于现有互联网应用来说,其实是非常重要的后端存储组件,而大多数系统故障都是由于存储所导致的,而数据库是重中之重,所以为了比较好掌握SQL的基本优化手段,打算用两篇文章从基本的联合索引优化、group by/order …