开闭原则(Open Close Principle)

一、定义:

软件中的(类、模块、函数等等)应该对于扩展是开放的,对于修改时关闭的。意味着一个实体允许在不改变它的源代码的前提变更它的行为

这里的软件包含一下几个部分:

1.项目中划分的模块

2.类与接口

3.方法

二、作用

使软件具有一定的适应性和灵活性的同时具备稳定性和延续性

1.对软件测试的影响

遵循开闭原则,只需要对扩展的代码进行测试,原有的测试 代码任然能够运行

2.提高代码复用性

粒度越小(功能越单一),越容易被复用。在面向对象的程序设计中,根据原子和抽象编程可以提高代码的复用性

3.提高软件的可维护性

遵循开闭原则的程序:稳定性高和延续性强,易于扩展和维护

三、开闭原则的实现方法

通过“抽象约束,封装变化”来实现开闭原则,即通过接口和抽象类为软件定义一个相对稳定的抽象层,而将相同的可变因素封装到相同的具体实现类中。

软件中稳定的用抽象或接口约束,易变的用实现类扩展

示例

定义成年人的行为:

固定的:吃饭 上班 睡觉

易变的:玩游戏 开车 运动

  1. public interface Person {
  2. public void eat();
  3. public void sleep();
  4. public void work();
  5. }
  6.  
  7. /**
  8. * 公交司机
  9. */
  10. public class BusDriver implements Person {
  11. private String name;
  12.  
  13. public BusDriver(String name) {
  14. this.name = name;
  15. }
  16.  
  17. @Override
  18. public void eat() {
  19. System.out.println(name + "在吃饭");
  20. }
  21.  
  22. @Override
  23. public void sleep() {
  24. System.out.println(name + "在睡觉");
  25. }
  26.  
  27. @Override
  28. public void work() {
  29. System.out.println(name + "在工作");
  30. }
  31.  
  32. /**
  33. * 开公交车:公交司机独有的
  34. */
  35. public void drive(){
  36. System.out.println(name + "在开公交车");
  37. }
  38.  
  39. public String getName() {
  40. return name;
  41. }
  42.  
  43. public void setName(String name) {
  44. this.name = name;
  45. }
  46. }
  47.  
  48. /**
  49. * 售票员
  50. */
  51. public class TicketSeller extends Person {
  52.  
  53. public TicketSeller(String name) {
  54. super(name);
  55. }
  56.  
  57. @Override
  58. protected void eat() {
  59. System.out.println(getName() + "在吃饭");
  60. }
  61.  
  62. @Override
  63. protected void sleep() {
  64. System.out.println(getName() + "在睡觉");
  65. }
  66.  
  67. @Override
  68. protected void work() {
  69. System.out.println(getName() + "在工作");
  70. }
  71.  
  72. /**
  73. * 售票员独有的
  74. */
  75. public void sellTicket(){
  76. System.out.println(getName() + "在买票");
  77. }
  78. }
  79. 测试:
  80. public static void main(String[] args) {
  81. BusDriver busDriver = new BusDriver("老王");
  82. busDriver.eat();
  83. busDriver.work();
  84. busDriver.drive();
  85. busDriver.sleep();
  86. TicketSeller sellTicket = new TicketSeller("李小姐");
  87. sellTicket.eat();
  88. sellTicket.work();
  89. sellTicket.sellTicket();
  90. sellTicket.sleep();
  91. }

测试结果:

结论:下次我增加了飞行员 等等其他类型的人,我直接增加子类就好,在子类中增加自己的方法,从而不用修改原有代码

这里面是个人理解,有书写错误的或者大家有更好更容易理解的可以提出来

Java的开发—面向对象的7大原则之开闭原则(一)的更多相关文章

  1. Java设计模式(1:软件架构设计七大原则及开闭原则详解)

    前言 在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题.为了解决.克服这个难题,笔主特别开了这个博客来记录自己学习的 ...

  2. 7.10 其他面向对象设计原则1: 开-闭原则OCP

    其他面向对象设计原则1: 开-闭原则OCP  Open-Closed Principle (OCP)5.1 设计变坏的前兆 Signs of Rotting Design  僵硬性 Rigidit ...

  3. 开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则

    单一职责原则 1.单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因 2.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或抑制这个类完成其他职责的能力. ...

  4. 设计原则:开闭原则(OCP)

    1.什么是开闭原则 开闭原则的英文是Open Closed Principle,缩写就是OCP.其定义如下: 软件实体(模块.类.方法等)应该"对扩展开放.对修改关闭". 从定义上 ...

  5. 设计原则:开-闭原则(Open-Closed Principle, OCP)

    开-闭原则就是软件实体应当对扩展开放,对修改关闭.(Software entities should be open for extension,but closed for modification ...

  6. js 的七大原则--单一原则、开闭原则、替换原则(一)

    一.前言: js 的七大设计原则: 1.单一原则 2.开闭原则 3.里氏替换原则 4.依赖倒转原则 5.接口隔离原则 6.合成复用原则 7.迪米尔法则 二.单一原则 1.定义:单一原则就是一个对象或者 ...

  7. 最简单直接地理解Java软件设计原则之开闭原则

    写在前面 本文属于Java软件设计原则系列文章的其中一篇,后续会继续分享其他的原则.想以最简单的方式,最直观的demo去彻底理解设计原则.文章属于个人整理.也欢迎大家提出不同的想法. 首先是一些理论性 ...

  8. 深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第2篇,开闭原则OCP(The Open/Closed Principle ). 开闭原则的描述是: Software ...

  9. java设计原则---开闭原则

    开闭原则:指的是一个软件实体应对对扩展开发,对修改关闭(Software entities should be open for extension, but closed for modificat ...

随机推荐

  1. AVR单片机教程——LCD1602

    本文隶属于AVR单片机教程系列.   显示屏 开发板套件里有两块屏幕,大的是LCD(液晶显示),小的是OLED(有机发光二极管).正与你所想的相反,短小精悍的比较贵,而本讲的主题--LCD1602-- ...

  2. css 脱离文档流

    一.float <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&quo ...

  3. ORM基础3 在python脚本里调用Django环境

    1.查询 1.# all获取所有的object,结果QuerySet,列表 print('all'.center(80, '=')) ret = models.Person.objects.all() ...

  4. 高通量计算框架HTCondor(三)——使用命令

    目录 1. 目录 2. 进程 3. 命令 3.1. condor_q 3.2. condor_status 3.3. conodr_submit 3.4. conodr_rm 4. 相关 1. 目录 ...

  5. Ubuntu16手动安装OpenStack——nova篇。。转

    前言: 本文转自https://www.voidking.com/dev-ubuntu16-manual-openstack-nova/ ,过程非常的详细,作者也说本实验最终失败,因为课程要求我们只要 ...

  6. Kivy 自定义控件之(一)

    lableSlider1.kv文件 <LabelSlider>: orientation:'vertical' BoxLayout: MyLabelSlider: name: 'Slide ...

  7. NVIDIA DRIVE

      NVIDIA 驱动安装(超详细) ref1: https://blog.csdn.net/qlulibin/article/details/78714596 ref2:https://www.cn ...

  8. c++中的动态内存分配

    使用new和delete动态的分配和释放内存 使用new来分配新的内存块,通常情况下,如果成功,new将返回一个指针,指向分配的内存,否则将引发异常,使用new时,需要指定要为那种数据类型分配内存: ...

  9. java-zhisji

    1. int indexOf(int ch):用来检查给定的一个字符在当前字符串中第一次出现的下标位置.这里的下标和数组的下标意思相近,0表示该字符串的第1个字符,以此类推.当该字符串中并不     ...

  10. Sqlite命令行基本操作

    SQLite是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程序库中. 与许多其它数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中. 1.进入命 ...