基本介绍

1、开闭(ocp)原则时编程中最基础、最重要的设计原则

2、一个软件实体如类、木块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。即对提供方开放,对使用方关闭

3、当软件需要变化时,尽量通过扩展软件实体的行为类实现变化,而不是通过修改已有代码来实现变化

4、编程中遵循其他原则,以及使用设计模式的目的就是遵循开闭原则

先来一段代码展示

  1. public class Ocp {
  2. public static void main(String[] args) {
  3. // 使用,看看存在的问题
  4. GraphicEditor graphicEditor = new GraphicEditor();
  5. graphicEditor.drawCircle(new Shape());
  6. graphicEditor.drawRectangle(new Shape());
  7. graphicEditor.drawOther(new Shape());
  8. }
  9. }
  10. //这是一个用于绘图的类
  11. class GraphicEditor {
  12. public void drawShape(Shape s) {
  13. if (s.m_type == 1) {
  14. drawRectangle(s);
  15. } else if (s.m_type == 2) {
  16. drawCircle(s);
  17. } else if (s.m_type == 3) {
  18. // 需在使用方添加(else if)代码快
  19. drawOther(s);
  20. }
  21. }
  22. public void drawRectangle(Shape s) {
  23. System.out.println("这是矩形");
  24. }
  25. public void drawCircle(Shape s) {
  26. System.out.println("这是圆形");
  27. }
  28. // 需在使用方添加新的方法
  29. public void drawOther(Shape s) {
  30. System.out.println("这是其他图形");
  31. }
  32. }
  33. class Shape {
  34. int m_type;
  35. }
  36. class Rectangle extends Shape {
  37. Rectangle() {
  38. super.m_type = 1;
  39. }
  40. }
  41. class Circle extends Shape {
  42. Circle() {
  43. super.m_type = 2;
  44. }
  45. }
  46. class Other extends Shape {
  47. Other() {
  48. super.m_type = 3;
  49. }
  50. }

分析这段代码中存在的问题

1、代码简单易懂,思路清晰。

2、但违反了设计模式的ocp原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码。

3、每增加一个功能都要需在使用方添加(else if)代码快,过多的(else if)会使代码过于臃肿,运行效率不高。

改进思路

创建一个Shape类,并提供一个抽象的draw()方法,让子类实现该方法。每当增加一个图形种类时,让该图形种类继承Shape类,并实现draw()方法。这样,使用方只需编写一个drawShape方法,传入一个图形类的对象,即可使用其相应的绘图方法。只需要修改提供方的代码,不需要修改使用方的代码,遵循ocp原则

使用ocp原则

  1. public class Ocp {
  2. public static void main(String[] args) {
  3. // 遵循ocp原则
  4. GraphicEditor graphicEditor = new GraphicEditor();
  5. graphicEditor.drawShape(new Rectangle());
  6. graphicEditor.drawShape(new Circle());
  7. graphicEditor.drawShape(new Other());
  8. }
  9. }
  10. //这是一个用于绘图的类,[使用方]
  11. class GraphicEditor {
  12. // 接收Shape对象,调用其对应的draw方法
  13. public void drawShape(Shape s) {
  14. s.draw();
  15. }
  16. }
  17. //Shape类,基类
  18. abstract class Shape {
  19. public int m_type;
  20. public abstract void draw(); // 抽象方法
  21. }
  22. class Rectangle extends Shape {
  23. Rectangle() {
  24. super.m_type = 1;
  25. }
  26. @Override
  27. public void draw() {
  28. System.out.println("这是矩形");
  29. }
  30. }
  31. class Circle extends Shape {
  32. Circle() {
  33. super.m_type = 2;
  34. }
  35. @Override
  36. public void draw() {
  37. System.out.println("这是圆形");
  38. }
  39. }
  40. //新增一个其他图形
  41. class Other extends Shape {
  42. Other() {
  43. super.m_type = 3;
  44. }
  45. @Override
  46. public void draw() {
  47. System.out.println("这是其他图形");
  48. }
  49. }

java设计模式学习笔记--开闭原则的更多相关文章

  1. java设计模式学习笔记--接口隔离原则

    接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...

  2. java设计模式学习笔记--单一职责原则

    单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...

  3. java设计模式学习笔记--依赖倒转原则

    依赖倒转原则简述 1.高层模块不应该依赖低层模块,二者都应该依赖其抽象 2.抽象不应该依赖细节,细节应该依赖抽象 3.依赖倒转得中心思想时面向接口编程 4.依赖倒转原则时基于这样得设计理念:相对于细节 ...

  4. java设计模式学习笔记——里氏替换原则

    oo中的继承性的思考和说明 1.继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些七月,但是如果子类对这些已经实现的方法任意修改,就会对 ...

  5. java设计模式学习笔记--浅谈设计模式

    设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...

  6. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  7. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  8. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  9. java设计模式学习笔记

    简介 设计模式可以分为五类 接口型 模式:适配器模式,外观模式,合成模式,桥接模式 职责型 模式:单例模式,观察者模式,调停者模式,代理模式,职责链模式,享元模式 构造型 模式:构建者模式,工厂方法模 ...

随机推荐

  1. 团队项目——Alpha1版本

    团队项目-Alpha版本发布1 一.格式描述 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/ ...

  2. 谈谈 InnoDB引擎中的一些索引策略

    如果我们在工作能够更好的利用好索引,那将会极大的提升数据库的性能. 覆盖索引 覆盖索引是指在普通索引树中可以得到查询的结果,不需要在回到主键索引树中再次搜索 建立如下这张表来演示覆盖索引: creat ...

  3. 基于swoole+Redis的消息实时推送通知

    swoole+Redis将实时数据的推送 一 实现功能 设计师订单如果设计师未抢单,超时(5分钟)设计订单时时给设计师派送, 设计师公众号中收到派单信息 设计发布者收到派单成功信息 环境 centos ...

  4. jdk for centos7

    https://www.cnblogs.com/chy123/p/6750351.html

  5. Docker底层架构之网络实现

    前言 Docker 的网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备(特别是 vethpair). 基本原理 首先,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)来 ...

  6. Java 中的运算符和流程控制

    Java 中的运算符和流程控制 + 面试题 算术运算符 Java 中的算术运算符,包括以下几种: **算术运算符** **名称** **举例** + 加法 1+2=3 - 减法 2-1=1 \* 乘法 ...

  7. ubuntu-14.04.6配置IP

    配置环境与要求: 网卡列表如下: eth0:DHCP模式 eth1:静态模式 网络概况与要求: 192.168.2.0/24为外网(获取网络资源) 10.5.1.0/24为内网(终端服务管理) 系统默 ...

  8. Codeforces_451_B

    http://codeforces.com/problemset/problem/451/B 取前后第一个不满足条件的位置,逆序,判断. #include<cstdio> #include ...

  9. MySQL复制(二)--基于二进制日志文件(binlog)配置复制

    基础环境:   主库 从库 服务器IP地址 192.168.10.11 192.168.10.12 版本 5.7.24 5.7.24 已存在的数据库 mysql> show databases; ...

  10. Linux系统资料

    Linux的心得: 1)Linux由众多微内核组成,其源代码完全开源: 2)Linux继承了Unix的特性,具有非常强大的网络功能,其支持所有的因特网协议,包括TCP/IPv4. TCP/IPv6和链 ...