【不就是Java设计模式吗】代码详解编程中最基础、最重要的设计原则——开闭原则(OCP)

简介: 【不就是Java设计模式吗】代码详解编程中最基础、最重要的设计原则——开闭原则(OCP)

一、基本介绍

开闭原则(OCP)是编程中最基础、最重要的设计原则

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

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

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

二、代码类图设计

类图设计如下:

image.png


三、代码对比

代码一:

public class One {
    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();
        else if (s.m_type == 2)
            drawCircle();
        else if (s.m_type == 3)
            drawTriangle();
    }
    //绘制矩形
    public void drawRectangle() {
        System.out.println(" 绘制矩形 ");
    }
    //绘制圆形
    public void drawCircle() {
        System.out.println(" 绘制圆形 ");
    }
    //绘制三角形
    public void drawTriangle() {
        System.out.println(" 绘制三角形 ");
    }
}
//Shape类,基类
class Shape {
    int m_type;
}
class Rectangle extends Shape {
    public Rectangle() {
        super.m_type = 1;
    }
}
class Circle extends Shape {
    public Circle() {
        super.m_type = 2;
    }
}
//新增画三角形
class Triangle extends Shape {
    public Triangle() {
        super.m_type = 3;
    }
}


代码一的优点是比较好理解,简单易操作。其缺点是违反了OCP开闭原则:当我们给类增加新功能的时候,尽量不修改代码或者尽可能少修改代码。当我们新增画三角形这个类时,修改的地方就比较多了,所以不好


代码二:

public class Two {
    public static void main(String[] args) {
        GraphicEditor1 graphicEditor1 = new GraphicEditor1();
        graphicEditor1.drawShape(new Rectangle1());
        graphicEditor1.drawShape(new Circle1());
        graphicEditor1.drawShape(new Triangle1());
        graphicEditor1.drawShape(new Others());
    }
}
//这是一个用于绘图的类 [使用方]
class GraphicEditor1 {
    public void drawShape(Shape1 shape1){
        shape1.draw();
    }
}
abstract class Shape1 {
    public abstract void draw();
}
class Rectangle1 extends Shape1 {
    public void draw() {
        System.out.println("绘制矩形");
    }
}
class Circle1 extends Shape1 {
    public void draw() {
        System.out.println("绘制圆形");
    }
}
//新增画三角形
class Triangle1 extends Shape1 {
    public void draw() {
        System.out.println("绘制三角形");
    }
}
class Others extends Shape1{
    public void draw() {
        System.out.println("绘制其它图形");
    }
}



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



相关文章
|
6天前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
144 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
26天前
|
设计模式 存储 关系型数据库
「全网最细 + 实战源码案例」设计模式——六大设计原则
本文介绍了面向对象设计中的六大原则,旨在提高软件系统的可维护性、可复用性和可拓展性。这些原则包括:开闭原则(OCP)、里氏代换原则(LSP)、依赖倒转原则(DIP)、接口隔离原则(ISP)、迪米特法则(LoD)和合成复用原则(CARP)。每项原则通过具体示例展示了如何通过抽象、多态、组合等方式降低耦合度,增强系统的灵活性与稳定性,从而提升开发效率并降低成本。
38 10
|
1月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
239 11
|
1月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
2月前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
74 3
|
2月前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
78 2
|
2月前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
2月前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
137 11
|
3月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
24天前
|
设计模式
「全网最细 + 实战源码案例」设计模式——模式扩展(配置工厂)
该设计通过配置文件和反射机制动态选择具体工厂,减少硬编码依赖,提升系统灵活性和扩展性。配置文件解耦、反射创建对象,新增产品族无需修改客户端代码。示例中,`CoffeeFactory`类加载配置文件并使用反射生成咖啡对象,客户端调用时只需指定名称即可获取对应产品实例。
86 40

热门文章

最新文章