前言

  学习设计原则,学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。

开闭原则(Open-Closed Principle, OCP)

  定义 : 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭,开闭原则也是其他五个原则的基石

  开闭原则是指一个软件实体如类、模块和函数应该对扩展开放, 对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节。可以提高软件系统的可复用性及可维护性。

  开闭原则是面向对象设计中最基础的设计原则。它指导我们如何建立稳定灵活的系统,例如:我们版本更新,我尽可能不修改源代码,但是可以增加新功能。

  在现实生活中对于开闭原则也有体现。比如,很多互联网公司都实行弹性制作息时间,规定每天工作 8 小时。意思就是说,对于每天工作 8 小时这个规定是关闭的,但是你什么时候来,什么时候走是开放的。早来早走,晚来晚走。

  下面我们以华为手机为例,首先创建一个华为手机接口:IHuaWei:

package com.wbg.dpsp.openClose;/*** @author WBG* @date 2020/8/2 0:14* @describe 华为手机*/
public interface IHuaWei {String getUUID();//主键String getName();//名称Double getPrice();//价格
}

View Code

  

  华为手机分为2G\3G\4G\5G,我们来创建一个G5手机

package com.wbg.dpsp.openClose;/*** @author WBG* @date 2020/8/2 0:23* @describe //华为5G*/
public class HuaWei5G implements IHuaWei {private String UUID;private String name;private Double price;public HuaWei5G() {}public HuaWei5G(String UUID, String name, Double price) {this.UUID = UUID;this.name = name;this.price = price;}public String getUUID() {return this.UUID;}public String getName() {return this.name;}public Double getPrice() {return this.price;}
}

View Code

  

华为5G需要做一个活动,价格优惠,如果修改HuaWei5G中的getPrice()方法,则会影响其他地方调用,我们如何在不修改原有代码前提前下,实现价格优惠这个功能呢?现在,我们再写一个处理优惠逻辑的类:HuaWei5GDiscount

package com.wbg.dpsp.openClose;/*** @author WBG* @date 2020/8/2 0:25* @describe 华为5G促销活动*/
public class HuaWei5GDiscount extends HuaWei5G {public HuaWei5GDiscount() {super();}public HuaWei5GDiscount(String UUID, String name, Double price) {super(UUID, name, price);}//打折活动public Double getDiscountPrice() {//六折优惠return super.getPrice() * 0.85;}}

View Code

测试结果:

package com.wbg.dpsp.openClose;/*** @author WBG* @date 2020/8/2 0:30* @describe*/
public class Test {public static void main(String[] args) {IHuaWei iHuaWei = new HuaWei5GDiscount("202008020031001","华为麦芒 9",2199.00);HuaWei5GDiscount huaWei5GDiscount = (HuaWei5GDiscount) iHuaWei;System.out.println("手机标识号:" + huaWei5GDiscount.getUUID() +"手机名称:《" +  huaWei5GDiscount.getName() + "》" +"\n原价:" + huaWei5GDiscount.getPrice() +"\n售价:" + huaWei5GDiscount.getDiscountPrice());}
}

View Code

类结构图:

设计模式(1)-- 七大软件设计原则-开闭原则相关推荐

  1. 面向对象软件设计的“开—闭”原则

    1.什么是开闭原则         "开-闭"原则是指软件实体应当对扩展性开放,对修改关闭.即软件实体应该在不修改的前提下扩展,这个原则实际上为软件设计指明了目标.我们知道软件设计 ...

  2. 一周技术学习笔记(第67期)-CPU的设计跟开闭原则有关系吗

    你能想到CPU的设计是开闭原则的设计吗 说CPU的设计很符合软件设计的开闭原则,估计一般的同学肯定不会这样意识到.其实我也一样不太可能把它们能够想在一起,并将它们关联起来. 可确实就这样发生了.实际上 ...

  3. 带你认识六种设计原则(开闭原则、里氏代换原则、依赖倒转原则....)

    前言 1. 设计原则 1.1. 开-闭原则 1.2. 里氏代换原则 1.3. 依赖倒转原则 1.4. 接口隔离原则 1.5. 合成/聚合原则 1.6. 迪米特法则 前言 学习设计模式之前先要了解其中的 ...

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

    定义 software entities like classes, modules and functions should be open for extension but closed for ...

  5. 设计模式6大原则-开闭原则

    设计模式6大原则-开闭原则 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 开闭原则理念就是当需求改变时,希望在不改变原有代码的前提下,通过扩展模块.函数来满足新需求. 开闭原则是其他 ...

  6. 设计模式之王者原则 开闭原则

    设计模式之王者原则  开闭原则 为什么说 它--开闭原则是王者原则呢? 因为所有原则都是围绕它来实现的,怎么说呢,为什么会有这么多原则呢,都是为了完成它,只要实现它你的代码就不会有什么大的问题 一.定 ...

  7. 六大设计模式原则-开闭原则

    一.开闭原则定义 开闭原则是面向对象的可复用设计的第一块基石,是最重要的面向对象设计原则.定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修 ...

  8. 【设计模式】软件设计七大原则 ( 开闭原则 )

    文章目录 一.开闭原则简介 二.开闭原则代码示例 1.商品接口 2.普通商品类 3.折扣商品类 4.测试类 一.开闭原则简介 开闭原则 : 定义 : 一个 软件实体 , 类 / 模块 / 函数 , 对 ...

  9. 软件设计的七大原则 --开闭原则 里氏替换原则 依赖倒置原则

    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 这 7 种设计原则是软件设计 ...

  10. Java设计模式七大原则-开闭原则

    开闭原则 基本介绍 开闭原则(Open Closed Principle)是编程中最基础.最重要的设计原则 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方).用抽象构建框 ...

最新文章

  1. Leetcode PHP题解--D54 937. Reorder Log Files
  2. pyhton3 rsa长加密/解密
  3. 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析
  4. Spring Boot中配置文件application.properties使用
  5. php 过滤微信符号昵称,PHP方法处理微信昵称特殊符号过滤
  6. 小米手机无法连上WIFI网络的解决方案
  7. java 的23种设计模式 之单身狗和隔壁老王的故事
  8. ArcGIS 10.2数字化线状要素时自己主动拼接成一条线
  9. c语言实现费诺编码csdn,香农编码 哈夫曼编码 费诺编码的比较
  10. assimp批量转模型,[OpenGL] 使用Assimp导入模型(Qt)
  11. 夏普Sharp MX-B401 一体机驱动
  12. GO 语言学习资源整理
  13. linux远程取证,linux系统取证
  14. chromium双核浏览器实现
  15. 20155218 《Java程序设计》实验二(Java面向对象程序设计)实验报告
  16. linux虚拟机+显卡驱动,ubuntu12.4优化android虚拟机和安装intel显卡驱动
  17. Linux下安装配置各种软件和服务
  18. 怎样在Mac上的Safari中观看YouTube画中画?
  19. 10M网线与100M网线和1000M(千兆)网线做法
  20. 游戏系列之无限弹窗游戏

热门文章

  1. Caffe学习:pycaffe利用caffemodel进行分类=批处理
  2. 基于卷积网络的度量学习
  3. Tensorspace一款神奇的神经网络可视化应用
  4. python--图像轮廓findContours
  5. 安装nodejs出现Invalid drive: f:\的解决办法
  6. java 命令行运行 打包 IDEA
  7. html浏览xsd,XSD 简易元素
  8. fabric1.0 java sdk_运行 fabric-sdk-java 官方示例
  9. mysql 连接 互联网_互联网技术分享社区 MySQL字符串连接函数
  10. linux nfs async,Linux下NFS共享以及oracle rman挂载优化