1.什么是开闭原则?

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

2.违反Ocp代码案例

package com.szh.principle.ocp;/****/
//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 GraphicEditor {//接收Shape对象,然后根据type,来绘制不同的图形public void drawShape(Shape s) {if (s.m_type == 1)drawRectangle(s);else if (s.m_type == 2)drawCircle(s);}//绘制矩形public void drawRectangle(Shape r) {System.out.println(" 绘制矩形 ");}//绘制圆形public void drawCircle(Shape r) {System.out.println(" 绘制圆形 ");}
}public class Ocp {public static void main(String[] args) {//使用看看存在的问题GraphicEditor graphicEditor = new GraphicEditor();graphicEditor.drawShape(new Rectangle());graphicEditor.drawShape(new Circle());}
}

根据上面的代码及运行结果来看,没一点问题,我们如愿的画出了矩形、圆形。但是现在有了一个新的需求,说 要增添一个图形(三角形),使代码完成对三角形的绘制,那么我们就需要对上面的代码进行修改。

package com.szh.principle.ocp;/****/
//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;}
}//这是一个用于绘图的类 [使用方]
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(" 绘制三角形 ");}
}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 类中也做了修改。  这就明显违反了开闭原则中的 对修改关闭 这个规则。

我们需要的是 对扩展开放,对修改关闭 的规则,也就是说增添一个三角形的时候,我们只需要在提供方做修改,在使用方是无需修改的。

也就是说,当我们给一个类增添新的功能时,尽量不修改代码,或者是尽量少的修改代码。


3.遵守Ocp代码案例

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

package com.szh.principle.ocp.improve;/****/
//Shape类,基类
abstract class Shape {int m_type;public abstract void draw();//抽象方法
}class Rectangle extends Shape {Rectangle() {super.m_type = 1;}@Overridepublic void draw() {System.out.println(" 绘制矩形 ");}
}class Circle extends Shape {Circle() {super.m_type = 2;}@Overridepublic void draw() {System.out.println(" 绘制圆形 ");}
}//这是一个用于绘图的类 [使用方]
class GraphicEditor {//接收Shape对象,调用draw方法public void drawShape(Shape s) {s.draw();}
}public class Ocp {public static void main(String[] args) {GraphicEditor graphicEditor = new GraphicEditor();graphicEditor.drawShape(new Rectangle());graphicEditor.drawShape(new Circle());}
}

上面是改进之后的代码,此时我们还像之前的案例一样,增添一个新的图形(三角形),并完成对三角形的绘制,那么对上面代码的修改就少之又少了。

修改代码如下:

设计模式七大原则——开闭原则相关推荐

  1. 设计模式中的开闭原则

    Table of Contents 1 设计模式中的开闭原则 1.1 基本原则 2 模式中的开-闭原则 2.1 策略模式 2.2 简单工厂 2.3 工厂方法 2.4 抽象工厂 2.5 建造者模式 2. ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. 设计模式的七大原则——开闭原则(下)

    开闭原则:   当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已 有的代码来实现变化. 开闭原则代码2:(遵循开闭原则,推荐使用) /*** 用于绘图的类[使用方]*/ cla ...

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

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

最新文章

  1. 一个网站项目的开始,定位有多重要?
  2. 别扭翻译之decentralization
  3. 独立硬盘冗余阵列与HDFS
  4. SQL Server游标的使用
  5. 第三次学JAVA再学不好就吃翔(part6)--基础语法之char数据类型
  6. 一款强大的Kubernetes API流量查看神器
  7. 8599元起!三星Galaxy Z Fold3/Flip3 5G折叠手机国行即将发货
  8. 牛头刨机械原理matlab代码
  9. 整理了 25 个前端相关的学习网站和一些靠谱的小工具,都来看看吧
  10. MySQL实时获取有性能问题的SQL
  11. 想换行做 5G 的开发者到底该咋办?
  12. win10任务栏怎么还原到下面_如何让你的Win10桌面变得更好看?
  13. sqlplus连接mysql_sqlplus 命令连接数据库
  14. 国家信息安全等级保护三级认证(三级等保设置以及注意点)
  15. 银耳椰椰——Alpha冲刺Day08
  16. H5+在浏览器中打开相机扫描二维码
  17. 图片色值提取工具-Color Hunter
  18. 解决Failed to connect to github.com port 443 after 21113 ms: Timed out
  19. 【笔记】Polygon mesh processing 读书笔记(1)
  20. 【英语语法】句子类型

热门文章

  1. rhel 7.2 mysql_Rhel7.2Mysql数据库安装及配置
  2. 天猫精灵AliGenie平台,Oauth token返回不正确解决方式
  3. 大数据平台hadoop运维之hadoop入门-高俊峰-专题视频课程
  4. android安装过程图片,Android的数字证书安装过程概述
  5. 用AES加密密钥长度报错问题
  6. Spark的安装与使用 第1关:Scala语言开发环境的部署
  7. ABP学习一(.Net6 API 整合 ABP)
  8. Mac 常用快捷键(Alfred+workflow+IDEA)
  9. 废旧光盘手工小制作_如何用废光碟制作DIY蜂鸟挂饰
  10. 为什么 group by后面 必须跟selecte 后面的除了聚集函数外的所有字段