我们一定要给自己提出这样的任务:第一,学习,第二是学习,第三还是学习。
学习从来无捷径,循序渐进登高峰。

目录

  • 一、基本介绍
  • 二、应用实例
    • 1、示例一
    • 2、示例二

部分笔记来源于尚硅谷设计模式视频教学。

一、基本介绍

  1. 开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则
  2. 一个软件实体如类,模块和函数应该对扩展开放(对提供方)对修改关闭(对使用方关闭)。用抽象构建框架,用实现扩展细节。
  3. 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化
  4. 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。

开发过程当中有的时候需要向第三方提供接口,我们属于就是提供方,那么第三方就属于使用方,使用方想要使用我们的接口,就得遵循我们的规范,并且是不允许让他们随意更改的,假如有一家更改了,那其他的可能没法用了。

二、应用实例

1、示例一

以下示例优缺点:

  1. 优点是比较好理解,简单易操作。
  2. 缺点是违反了设计模式的ocp(开闭)原则,即对扩展开放(提供方),对修改关闭(使用方)。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码.

比如我们这时要新增加一个图形种类 三角形,我们需要做如下修改,修改的地方较多

public class Ocp {public static void main(String[] args) {//使用看看存在的问题GraphicEditor graphicEditor = new GraphicEditor();graphicEditor.drawShape(new Rectangle());graphicEditor.drawShape(new Circle());graphicEditor.drawShape(new Triangle());}}//这是一个用于绘图的类 [使用方]
class GraphicEditor {//接收Shape对象,然后根据type,来绘制不同的图形public void drawShape(Shape s) {if (s.m_type == 1)drawRectangle(s);else if (s.m_type == 2)drawCircle(s);else if (s.m_type == 3)drawTriangle(s);}//绘制矩形public void drawRectangle(Shape r) {System.out.println(" 绘制矩形 ");}//绘制圆形public void drawCircle(Shape r) {System.out.println(" 绘制圆形 ");}//绘制三角形public void drawTriangle(Shape r) {System.out.println(" 绘制三角形 ");}
}//Shape类,基类
class Shape {int m_type;
}class Rectangle extends Shape {Rectangle() {super.m_type = 1;}
}class Circle extends Shape {Circle() {super.m_type = 2;}
}//新增画三角形
class Triangle extends Shape {Triangle() {super.m_type = 3;}
}

2、示例二

改进的思路分析:

把创建Shape类做成抽象类,并提供一个抽象的draw方法,让子类去实现即可,
这样我们有新的图形种类时,只需要让新的图形类继承Shape,并实现draw方法即可,使用方的代码就不需要修 -> 满足了开闭原则

public class Ocp {public static void main(String[] args) {//使用看看存在的问题GraphicEditor graphicEditor = new GraphicEditor();graphicEditor.drawShape(new Rectangle());graphicEditor.drawShape(new Circle());graphicEditor.drawShape(new Triangle());graphicEditor.drawShape(new OtherGraphic());}}//这是一个用于绘图的类 [使用方]
class GraphicEditor {//接收Shape对象,调用draw方法public void drawShape(Shape s) {s.draw();}
}//Shape类,基类
abstract class Shape {int m_type;public abstract void draw();//抽象方法
}class Rectangle extends Shape {Rectangle() {super.m_type = 1;}@Overridepublic void draw() {// TODO Auto-generated method stubSystem.out.println(" 绘制矩形 ");}
}class Circle extends Shape {Circle() {super.m_type = 2;}@Overridepublic void draw() {// TODO Auto-generated method stubSystem.out.println(" 绘制圆形 ");}
}//新增画三角形
class Triangle extends Shape {Triangle() {super.m_type = 3;}@Overridepublic void draw() {// TODO Auto-generated method stubSystem.out.println(" 绘制三角形 ");}
}//新增一个图形
class OtherGraphic extends Shape {OtherGraphic() {super.m_type = 4;}@Overridepublic void draw() {// TODO Auto-generated method stubSystem.out.println(" 绘制其它图形 ");}
}

Java设计原则——开闭原则相关推荐

  1. 面向对象软件设计原则【JAVA】(开闭原则、里氏代换、依赖倒转、接口隔离、迪米特法则、合成复用原则)

    软件设计原则[JAVA](开闭原则.里氏代换.依赖倒转.接口隔离.迪米特法则.合成复用原则) 1.开闭原则 2.里氏代换原则 3.依赖倒转原则 4.接口隔离原则 5.迪米特法则 6.合成复用原则 1. ...

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

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

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

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

  4. Java面向对象之开闭原则

    开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则.开闭原则由Bertrand  Meyer于1988年提出,其定义如下: 开闭原则(Open-Closed Principle, ...

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

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

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

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

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

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

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

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

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

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

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

    一. 什么是开闭原则(Open Closed Principle)? 开闭原则(Open Closed Principle,OCP)又称为ocp原则, 由勃兰特·梅耶(Bertrand Meyer)提 ...

最新文章

  1. 怎样快速学习React
  2. HNOI2019游记
  3. java中float和double型数据在赋值时有哪些注意事项?,java语言中float和double类型的数据在编程时的注意事项...
  4. 使用Postgrest快速创建数据库的OpenAPI接口
  5. UA MATH575B 数值分析下III 图像恢复
  6. 一阶系统单位阶跃响应的特点_第八讲 系统的时域响应
  7. linux打开sqlite3数据库,Centos6.5中如何用sqlite3命令打开’.db’后缀的数据库执行sql...
  8. html股票数据代码,股票数据的网站抓取(4.2)代码优化
  9. 什么都没学到,记录一个鼠标监听事件吧
  10. java事件大全_JavaScript事件大全
  11. leetcode 刷题指南
  12. Leetcode#191Number of 1 Bits
  13. mongoDB之监控工具mongotop
  14. Linux系统调用接口添加简单示例
  15. 【HDU 5965】扫雷【线性递推】
  16. IMX6DL 串口篇
  17. 华为魔术2手机拆机图解_华为手机荣耀Magic2手机维修拆机教程
  18. SecureCRT创建串口连接
  19. python 画图工具——matplotlib命令式函数
  20. 前程无忧网站,职位信息一步到位函数爬取!!!真一步到位

热门文章

  1. 配置openfalcon监控kafka lag堆积情况
  2. 如何快速打开画图,计算器,记事本等小工具
  3. 动态规划经典题目-最小权三角剖分
  4. 怎么在Linux内核模块加打印,在ARM-linux上实现4G模块PPP拨号上网
  5. 在CentOS 7上安装Python 3.9
  6. pyqt5+feapder+mysql简单爬取newrank的数据。
  7. Surface 系统恢复
  8. 初识Java需要了解
  9. 将微积分基本定理中的牛顿-莱布尼兹公式写成散度定理的形式
  10. 接入微信支付报错:time_expire时间过短,刷卡至少1分钟,其他5分钟