文章目录

  • 一、开闭原则简介
  • 二、开闭原则代码示例
    • 1、商品接口
    • 2、普通商品类
    • 3、折扣商品类
    • 4、测试类

一、开闭原则简介


开闭原则 :

  • 定义 : 一个 软件实体 , 类 / 模块 / 函数 , 对 扩展 开放 , 对 修改 关闭 ;
  • 抽象与实现 : 用 抽象 构建框架 , 用 实现 扩展细节 ;
  • 优点 : 提高 软件系统 的 可复用性 及 可维护性 ;

开闭原则 是 面向对象 设计 中 , 最基础的 设计原则 , 它指导我们建立稳定灵活的系统 ;

开发新功能时 , 尽量 不修改原有的代码 , 尽量 使用扩展增加新功能 ;

实现 开闭原则 的核心思想 是面向抽象编程 , 不是面向实现编程 ;

定义的 对象类型 是 抽象类类型 或 接口类型 , 调用的方法 是 抽象类 或 接口 中的方法 ;

抽象是 稳定的 , 让类依赖于抽象 , 对于修改来说就是封闭的 ;

通过 面向对象 的 继承 , 以及 多态机制 , 可以实现 对 抽象 的 继承 , 通过 重写改变其固有方法 , 或 实现新的扩展方法 ;

二、开闭原则代码示例


1、商品接口

package openclose;/*** 商品接口*/
public interface IGood {Integer getId();String getName();Double getPrice();
}

2、普通商品类

package openclose;/*** 普通的商品类*/
public class NormalGood implements IGood {private Integer id;private String name;private Double price;public NormalGood(Integer id, String name, Double price) {this.id = id;this.name = name;this.price = price;}@Overridepublic Integer getId() {return this.id;}@Overridepublic String getName() {return this.name;}@Overridepublic Double getPrice() {return this.price;}@Overridepublic String toString() {return "NormalGood{" +"id=" + id +", name='" + name + '\'' +", price=" + price +'}';}
}

3、折扣商品类

如果要添加一个商品打折功能 , 不能直接修改 IGood 接口 , 或 NormalGood 类 , 只要修改了 , 就给之前的功能带来了隐患 ;

根据开闭原则 , 对修改关闭 , 对扩展开放 ;

这里直接定义 NormalGood 类的子类 , 在继承 NormalGood 类的基础上 , 开发扩展的新功能 ;

package openclose;/*** 打折商品类* 加入一个 商品 打折的功能*      不能直接修改 IGood 接口 , 或 NormalGood 类*      只要修改了 , 就给之前的功能带来了隐患* 这里直接定义 NormalGood 类的子类*      在继承 NormalGood 类的基础上 , 开发扩展的新功能*/
public class DiscountGood extends NormalGood {public DiscountGood(Integer id, String name, Double price) {super(id, name, price);}@Overridepublic Double getPrice() {return super.getPrice() * 0.5;}
}

4、测试类

package openclose;public class Main {public static void main(String[] args) {IGood normalGood = new NormalGood(8, "普通商品", 88.0);System.out.println("商品信息 : " + normalGood);IGood discountGood = new DiscountGood(9, "Java 折扣课程", 88.0);System.out.println("折扣商品信息 : " + discountGood + " , 折扣价格 : " + discountGood.getPrice());}
}

执行结果 :

商品信息 : NormalGood{id=8, name='普通商品', price=88.0}
折扣商品信息 : NormalGood{id=9, name='Java 折扣课程', price=88.0} , 折扣价格 : 44.0

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

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

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

  2. 设计模式-软件设计七大原则

    目录 综述 1.开闭原则 1.1开闭原则的定义 1.2开闭原则的作用 1.3开闭原则的实现方法 2.里氏替换原则 2.1里氏替换原则的定义 2.2里氏替换原则的作用 2.3里氏替换原则的实现方法 3. ...

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

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

  4. 设计模式七大原则——开闭原则

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

  5. 设计一个扩展自抽象类geometricobject的新的triangle类_面向对象设计原则之开放封闭原则(开闭原则OCP)...

    (1) 定义 一个软件实体(类.模块.函数等),对于扩展是开放的,对于更改是封闭的. 对于扩展是开放的:这意味着模块的行为是可以扩展的.当应用的需求发生改变时,我们可以对模块进行扩展,比如增加新的类或 ...

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

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

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

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

  8. Java设计原则——开闭原则

    我们一定要给自己提出这样的任务:第一,学习,第二是学习,第三还是学习. 学习从来无捷径,循序渐进登高峰. 目录 一.基本介绍 二.应用实例 1.示例一 2.示例二 部分笔记来源于尚硅谷设计模式视频教学 ...

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

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

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

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

最新文章

  1. Android10.0应用进程创建过程以及Zygote的fork流程-[Android取经之路]
  2. 【BZOJ】1067: [SCOI2007]降雨量(rmq+变态题)
  3. SpringCloud(第二部分)
  4. 互联网1分钟 |1221
  5. java安全编码指南之:字符串和编码
  6. android viewpager 滑动方法,Android中Viewpager禁止滑动的实现
  7. VMware pro 15 ubuntu简易安装虚拟机黑屏
  8. Flask和WebSocket
  9. IOS技术分享| 你画我猜小游戏快速实现
  10. 32G内存服务器如何设置虚拟内存,大内存服务器设置虚拟内存
  11. LetCode#69(JAVA)给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去.
  12. ardupilot 关于设备车Rover的学习《3》------模式控制
  13. G1 Concurrent Refinement Thread 在干啥?
  14. esp32 Micropython驱动ST7735 1.8寸TFT屏幕 中文显示;时间显示、网络network实时时间获取utptime;urequests、upip等包安装
  15. C语言学习笔记第十天
  16. python爬猫眼电影影评,Python系列爬虫之爬取并简单分析猫眼电影影评
  17. 12小时制转24小时制
  18. 剑灵力士卡刀ahk_剑灵卡刀指令
  19. Firefox 加速技巧
  20. Linux中创建组的命令,linux创建用户组命令

热门文章

  1. 领航的公开课 有空可以看看
  2. MNMBottomPullToRefresh
  3. benet 3.0的构建企业网络视频第二章地址
  4. 5.1 指针与地址 (C)
  5. 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?
  6. 计算机网络第七版(谢希仁著)课后习题答案
  7. C语言第一次博客作业——输入输出格式
  8. HokeyPokey — WWDC讲师特供XCode插件高仿版的设计与实现
  9. FlatBuffers初探
  10. c#编译器对byte类型的一些规则 (转)