基本介绍

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

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

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

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

先来一段代码展示

public class Ocp {
public static void main(String[] args) {
// 使用,看看存在的问题
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawCircle(new Shape());
graphicEditor.drawRectangle(new Shape());
graphicEditor.drawOther(new Shape()); }
} //这是一个用于绘图的类
class GraphicEditor {
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) {
// 需在使用方添加(else if)代码快
drawOther(s);
}
} public void drawRectangle(Shape s) {
System.out.println("这是矩形");
} public void drawCircle(Shape s) {
System.out.println("这是圆形");
} // 需在使用方添加新的方法
public void drawOther(Shape s) {
System.out.println("这是其他图形");
}
} class Shape {
int m_type;
} class Rectangle extends Shape {
Rectangle() {
super.m_type = 1;
}
} class Circle extends Shape {
Circle() {
super.m_type = 2;
}
} class Other extends Shape {
Other() {
super.m_type = 3;
}
}

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

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

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

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

改进思路

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

使用ocp原则

public class Ocp {
public static void main(String[] args) {
// 遵循ocp原则
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawShape(new Rectangle());
graphicEditor.drawShape(new Circle());
graphicEditor.drawShape(new Other()); }
} //这是一个用于绘图的类,[使用方]
class GraphicEditor {
// 接收Shape对象,调用其对应的draw方法
public void drawShape(Shape s) {
s.draw();
}
} //Shape类,基类
abstract class Shape {
public int m_type; public abstract void draw(); // 抽象方法
} class Rectangle extends Shape {
Rectangle() {
super.m_type = 1;
} @Override
public void draw() {
System.out.println("这是矩形");
}
} class Circle extends Shape {
Circle() {
super.m_type = 2;
} @Override
public void draw() {
System.out.println("这是圆形");
}
} //新增一个其他图形
class Other extends Shape {
Other() {
super.m_type = 3;
} @Override
public void draw() {
System.out.println("这是其他图形");
}
}

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. maven本地添加Oracle包

    因为版权原因,Java后台连接数据库的ojdbc包并不可以用maven直接从网上下载导入,所以需要我们手动将其资源放在本地.下面是步骤: 1.找到Oracle ojdbc6包,拷贝到某备份目录2.包目 ...

  2. Qt Installer Framework翻译(7-2)

    包文件夹 安装程序包含的组件,要么是内嵌的,要么可以从远程存储库加载.在这两种情况下,都需要为组件使用一种安装程序可以读取的文件格式和结构. 包文件夹结构 将所有组件放在相同的根文件夹中,即包文件夹. ...

  3. Tensorflow下指定显卡占用比例参数配置

    tensorflow在训练时默认占用所有GPU的显存. 可以通过以下方式解决该问题: 1.在构造tf.Session()时候通过传递tf.GPUOptions作为可选配置参数的一部分来显式地指定需要分 ...

  4. URL方案最佳做法|高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼

    使 URL整洁和人性化 GET(安全交互)和POST(不安全交互):选用正确的一个.

  5. 使用postman测试接口

    1.什么是接口测试 其实接口测试就和普通功能测试没什么区别,区别就是功能测试是在页面上点点点,在页面上输入值,提交数据看结果,而接口测试没有页面,通过接口规范文档上的调用地址.请求参数,拼接报文,然后 ...

  6. Referer防盗链

    一.目录展示 分为AProject和BProject两个项目进行测试 二.修改c:\windows\system32\drivers\etc下的hosts文件 三.aindex.jsp 四.binde ...

  7. Centos 7 最小化部署svn版本控制(http协议)

    1.关闭selinux sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config sh-4.2# reboot 2.卸载防火墙 sh-4.2 ...

  8. 并发队列之ConcurrentLinkedQueue

    本来想着直接说线程池的,不过在说线程池之前,我们必须要知道并发安全队列:因为一般情况下线程池中的线程数量是一定的,肯定不会超过某个阈值,那么当任务太多了的时候,我们必须把多余的任务保存到并发安全队列中 ...

  9. 基于Mybatis的bookstore架构模型

    总共分为Control,dao,enter,entity,service,util,view这几层.同时还含有一个mapperconfig.xml文件. 1,mapperconfig.xml 这里面用 ...

  10. 【WPF学习】第三十八章 行为

    样式提供了重用一组属性设置的实用方法.它们为帮助构建一致的.组织良好的界面迈出了重要的第一步——但是它们也是有许多限制. 问题是在典型的应用程序中,属性设置仅是用户界面基础结构的一小部分.甚至最基本的 ...