1、基本介绍

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

2、应用实例

绘图功能,类图如下:

2.1未遵循开闭原则

优点是比较好理解,简单操作。

缺点是违反了设计模式的ocp原则,即对扩展开放(提供方),对修改关闭(使用方)。即当给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码。

比如要新增加一个图形种类:三角形时,修改的地方较多

package com.weirdo.principle.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.2遵循开闭原则

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

package com.weirdo.principle.ocp.improve;
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());}
}
abstract class Shape{int m_type;//抽象方法public abstract void draw();
}
//这是一个用于绘图的类[使用方]
class GraphicEditor {//接收Shape对象,调用draw方法public void drawShape(Shape s) {s.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 Triangle extends Shape {Triangle(){super.m_type=3;}@Overridepublic void draw() {System.out.println("绘制三角形");}
}
//新增一个图形
class OtherGraphic extends Shape{OtherGraphic(){super.m_type=4;}@Overridepublic void draw() {System.out.println("绘制其它图形");}
}

Java设计模式——开闭原则(实例)相关推荐

  1. 图解Java设计模式-开闭原则

    开闭原则是编程中最基础,最重要的设计原则 一个软件实体如类,模块和函数应该对外开放(对提供方),对修改关闭(对使用方).用抽象构建框架,用实现扩展细节 当软件需要变化时,尽量通过扩展软件实体的行为来实 ...

  2. Java设计模式-开闭原则

    总原则:开闭原则(Open Close Principle)   定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭.   问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件 ...

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

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

  4. 设计模式-开闭原则(6)

    设计原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 开闭原则 开闭原则是Java世界里最基础的设计原则, 它指导我们如何建立一个稳定的. 灵活的系统, 先来看开闭原 ...

  5. 23种设计模式-开闭原则

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

  6. 设计模式——开闭原则

    开闭原则:对扩展开放,对修改关闭. 具体实现:为系统定义一个相对稳定的抽象层,而将不同的实现行为移至具体的实现层中完成.在很多面向对象编程语言中都提供了接口.抽象类等机制,可以通过它们定义系统的抽象层 ...

  7. [设计模式]开闭原则

    开闭原则: 对扩展开放,对修改关闭. 增加功能是提过增加代码来实现的,而不是去修改源代码. 代码如下: #include <iostream> #include <string> ...

  8. 设计模式-开闭原则(OCP)

    开闭原则(open closed principle) 目标:已有的场景下,对于需要拓展的进行开放,拒绝直接的功能修改 需求: 吃鸡游戏要高亮 + LOL需要弹出折扣 // sprint1 - 青年节 ...

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

    静态工厂模式 + 反射控制入参范围 public interface IPrinter {void print(); }public class CanonPrinter implements IPr ...

最新文章

  1. gns3 查看网关_gns3常用命令
  2. 非接触物体尺寸形态测量_如何确定接触式和非接触式测量之间的测量技术
  3. python模块之lib2to3(py2转py3自动化工具)
  4. mysql8.0.17压缩包安装教程_mysql 8.0.16 压缩包安装配置方法图文教程
  5. 在uipath_UiPath狂欢节Day 3——国内超级企业CFO大咖RPA案例分享!
  6. mysql多个外键删除设置_Mysql在删除集上使用多个外键创建表
  7. 用matlab代码分析不同尺寸的卷积核对图像的影响
  8. 商品包含资源和劳动两部分内容
  9. Riverbed宣布收购SD-WAN供应商Ocedo
  10. 计算机硬盘损坏 数据如何修复,如何修复计算机硬盘错误?如何从硬盘数据损坏中恢复数据?...
  11. html字大小自适应,html字体大小自适应 怎样让HTML字体自适应到移动端?
  12. CentOS 6.7 源码搭建LNMP架构部署动态网站环境
  13. 计算机 竞赛 甘肃,甘肃省第三届创新杯计算机应用能力大赛获奖名单
  14. 【基于MATLAB的数字图像处理】第三章·基本图像变换
  15. 成员变量、类变量和静态变量三者的区别
  16. 面试的时候我为什么会紧张
  17. 基于JAVA Web的航空订票系统
  18. 采集时如何有效地防止被网站屏蔽IP
  19. 利用Jquery Lazyload JS插件实现网页图片延迟加载
  20. 智慧校园建设主要包括哪些方面的内容?

热门文章

  1. 短信验证码接口的实现
  2. 网格化巡查二维码的意义及应用
  3. 实现远程休眠唤醒4G低功耗车牌识别摄像头方案
  4. 5种电商数据的采集工具
  5. c# VSTO学习一——基本认识
  6. 使用GDIView工具排查GDI对象泄漏导致程序UI界面绘制异常的问题
  7. PS中选中图层以及查看单个图层的方法
  8. unity简单的登录注册界面
  9. 泽泽在巴西(jzoj普及组模拟第三题)(超难)
  10. 2019年头条笔试题大锤升职