一、开闭原则介绍

开闭原则(Open Closed Principle)是编程中最基础,也是最重要的设计原则。编程中遵循其他原则以及使用设计模式的目的就是遵循开闭原则。

一个软件实体如类,模块和函数应该对(提供方)扩展开放,对(使用方)修改关闭。用抽象构建架构,用实现扩展细节。当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。

二、案例讲解

实现一个画图形的功能,类图设计如下:

第一种解决方案:传统方案

代码实现如下:

public class Shape{int type;
}
public class Rectangle extends Shape{public Rectangle(){super.type = 1;}}
public class Circle extends Shape{public Circle(){super.type = 2;}
}
public class GraphicEditor{public void drawShape(Shape s){if(1 == s.type){drawRectangle();} else if(2 == s.type){drawCircle();}}public void drawRectangle(){System.out.println("绘制矩形");}public void drawCircle(){System.out.println("画圆形");}}
public class Test(){public static void main(String[] args){GraphicEditor editor = new GraphicEditor();editor.drawShape(new Rectangle());editor.drawShape(new Circle());}
}

上面的实现方式比较好理解,简单易操作,但是如果这时要增加一个图形种类三角形,我们需要修改的地方很多,这就违反了开闭原则,即对扩展开放,对修改关闭。当我们给类添加新功能的时候,应该尽量不修改代码,或者尽可能少修改代码。

第二种解决方案:使用开闭原则   

对上面代码改进思路:把创建Shape类做成抽象类,并提供一个抽象的draw方法,让子类去实现即可。这样有新的图形种类时,只需要让新的图形类继承Shape,并实现draw方法即可。使用方的代码就不需要修改,满足开闭原则。代码如下:

public abstract class Shape{int type;abstract void draw();
}
public class Rectangle extends Shape{public Rectangle(){super.type = 1;}public void draw(){System.out.println("绘制矩形");}
}
public class Circle extends Shape{public Circle(){super.type = 2;}public void draw(){System.out.println("画圆形");}
}
public class GraphicEditor{public void drawShape(Shape s){s.draw();}
}
public class Test(){public static void main(String[] args){GraphicEditor editor = new GraphicEditor();editor.draw(new Rectangle());editor.draw(new Circle());}
}

注:类Shape、Rectangle、Circle是提供方,类GraphicEditor是使用方

七大设计原则之开闭原则相关推荐

  1. 设计模式-软件架构设计七大原则及开闭原则详解

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

  2. Java设计原则之单一职责原则、开闭原则、里氏代换原则

    文章目录 面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 面向对象设计原则概述 软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量 ...

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

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

  4. 设计模式-02.经典设计原则-第一节-单一职责原则,开闭原则,里式替换,接口隔离【万字长文系列】

    文章目录 设计模式经典设计原则-第一节 单一职责原则(SRP) 如何理解单一职责原则? 如何判断类的职责是否足够单一? 类的职责是否设计得越单一越好? 开闭原则(OCP) 如何理解"对扩展开 ...

  5. [设计原则] 六大设计原则之“开闭原则”

    [设计原则] 六大设计原则之"开闭原则" 目录 [设计原则] 六大设计原则之"开闭原则" 什么是开闭原则 为什么使用开闭原则 如何使用开闭原则 注意事项 总结 ...

  6. Java面向对象设计原则1——开闭原则

    在我们学习面向对象编程的时候,总会出现一些问题,好比以前刚刚写好的代码,上线测试可以.正常运行,突然有一天说要加一个功能,改完之后,发现以前正常运行的功能不能用了,类似这样的问题有好多好多,为了避免类 ...

  7. 设计模式六大原则之--开闭原则(OCP)

    设计模式六大原则之--开闭原则(OCP) 前言 1 描述 2 理解: 3 问题由来: 4 使用LoD的好处: 5 难点: 6 最佳实践: 7 范例: 前言 The Open - Closed Prin ...

  8. 关于Java面向对象程序设计原则之一——开闭原则的思考与分享

    整理日期:2022-05-27 目录 一.开闭原则 二.为什么使用开闭原则 三.如何在程序设计中体现开闭原则 一.开闭原则 开闭原则(Open-Closed Principle, OCP)是指一个软件 ...

  9. 源码分析七大设计原则之开闭原则(Open Close Principle)

    源码分析之七大设计原则 一.开闭原则(Open Close Principle) 定义:软件实体应当对扩展开放,对修改关闭,即:软件系统中包含的各种组件,例如模块(Modules).类(Classes ...

最新文章

  1. php删除指定图片吗,PHP 去除图片指定颜色
  2. 图像模糊处理(信息学奥赛一本通-T1128)
  3. 如何设计一个权限系统
  4. Kali Linux 秘籍 第三章 高级测试环境
  5. OAuth 授权的工作原理是怎样的?
  6. 【GBK、UTF-8、ISO8859-1】三种编码方式总结及实例
  7. 解决genemotion模拟器冲突导致的Android Studio无法启动ADB的问题
  8. 水泵调速c语言实验程序,C语言实验最原始.doc
  9. 上计算机课玩游戏检讨400字,上网课玩游戏检讨书
  10. 【Kafka】10道不得不会的 Kafka 面试题
  11. FPGA——按键消抖
  12. 立即执行的js插件,转成可以在VUE环境下使用,
  13. 小程序数据监测工具分析
  14. jsp之${CTX}理解
  15. 老板,上班迷路了,晚点到~
  16. 快速删除node_modules文件夹:rimraf node_modules
  17. 踩坑三丰云、踩坑主机屋云服务
  18. 约束优化求解之罚函数法
  19. java mvc设计_javaweb之MVC设计模式
  20. CAEE2023精密冲压件/五金件、精密冲床、模具展览会

热门文章

  1. 生日快乐程序_「秒福」小程序:送祝福,2020我们不一样
  2. 关于联通主义是否不合时宜的一些思考
  3. 网络安全--SQL注入介绍
  4. 《计算机网络》学习笔记----第七版课后习题参考答案 第三章
  5. Ping 命令详解(含真实操作截图)
  6. 官方确认索尼PS5创史上最佳首发记录 国行版可能要2021年见
  7. 21.炫酷的CSS数字j时钟
  8. linux gzip压缩/解压缩*.gz文件
  9. [原创]gsoap的基本使用方法『C++web服务工具包』
  10. 盗墓笔记讲的什么秘密_为什么组织有公开的秘密?