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

简介: 【设计模式】软件设计七大原则 ( 开闭原则 )

文章目录

一、开闭原则简介

二、开闭原则代码示例

1、商品接口

2、普通商品类

3、折扣商品类

4、测试类





一、开闭原则简介


开闭原则 :


定义 : 一个 软件实体 , 类 / 模块 / 函数 , 对 扩展 开放 , 对 修改 关闭 ;

抽象与实现 : 用 抽象 构建框架 , 用 实现 扩展细节 ;

优点 : 提高 软件系统 的 可复用性 及 可维护性 ;


开闭原则 是 面向对象 设计 中 , 最基础的 设计原则 , 它指导我们建立稳定灵活的系统 ;


开发新功能时 , 尽量 不修改原有的代码 , 尽量 使用扩展增加新功能 ;



实现 开闭原则 的核心思想 是面向抽象编程 , 不是面向实现编程 ;


定义的 对象类型 是 抽象类类型 或 接口类型 , 调用的方法 是 抽象类 或 接口 中的方法 ;



抽象是 稳定的 , 让类依赖于抽象 , 对于修改来说就是封闭的 ;


通过 面向对象 的 继承 , 以及 多态机制 , 可以实现 对 抽象 的 继承 , 通过 重写改变其固有方法 , 或 实现新的扩展方法 ;






二、开闭原则代码示例



1、商品接口


package openclose;
/**
 * 商品接口
 */
public interface IGood {
    Integer getId();
    String getName();
    Double getPrice();
}




2、普通商品类


package openclose;
/**
 * 普通的商品类
 */
public class NormalGood implements IGood {
    private Integer id;
    private String name;
    private Double price;
    public NormalGood(Integer id, String name, Double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }
    @Override
    public Integer getId() {
        return this.id;
    }
    @Override
    public String getName() {
        return this.name;
    }
    @Override
    public Double getPrice() {
        return this.price;
    }
    @Override
    public String toString() {
        return "NormalGood{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}


3、折扣商品类


如果要添加一个商品打折功能 , 不能直接修改 IGood 接口 , 或 NormalGood 类 , 只要修改了 , 就给之前的功能带来了隐患 ;


根据开闭原则 , 对修改关闭 , 对扩展开放 ;


这里直接定义 NormalGood 类的子类 , 在继承 NormalGood 类的基础上 , 开发扩展的新功能 ;


package openclose;
/**
 * 打折商品类
 * 加入一个 商品 打折的功能
 *      不能直接修改 IGood 接口 , 或 NormalGood 类
 *      只要修改了 , 就给之前的功能带来了隐患
 * 这里直接定义 NormalGood 类的子类
 *      在继承 NormalGood 类的基础上 , 开发扩展的新功能
 */
public class DiscountGood extends NormalGood {
    public DiscountGood(Integer id, String name, Double price) {
        super(id, name, price);
    }
    @Override
    public Double getPrice() {
        return super.getPrice() * 0.5;
    }
}



4、测试类


package openclose;
public class Main {
    public static void main(String[] args) {
        IGood normalGood = new NormalGood(8, "普通商品", 88.0);
        System.out.println("商品信息 : " + normalGood);
        IGood discountGood = new DiscountGood(9, "Java 折扣课程", 88.0);
        System.out.println("折扣商品信息 : " + discountGood + " , 折扣价格 : " + discountGood.getPrice());
    }
}


执行结果 :


商品信息 : NormalGood{id=8, name='普通商品', price=88.0}
折扣商品信息 : NormalGood{id=9, name='Java 折扣课程', price=88.0} , 折扣价格 : 44.0


image.png

目录
相关文章
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
设计模式 存储 前端开发
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
|
设计模式 架构师 Java
设计模式觉醒系列(01)设计模式的基石 | 六大原则的核心是什么?
本文介绍了设计模式的六大原则,包括单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)和迪米特法则。通过具体案例分析了每个原则的应用场景及优势,强调了这些原则在提升代码可维护性、可复用性、可扩展性和降低耦合度方面的重要作用。文章指出,设计模式的核心在于确保系统模块间的低耦合高内聚,并为后续深入探讨23个经典设计模式打下基础。
|
设计模式 Java 程序员
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
本系列文章聚焦于面向对象软件设计中的设计模式,旨在帮助开发人员掌握23种经典设计模式及其应用。内容分为三大部分:第一部分介绍设计模式的概念、UML图和软件设计原则;第二部分详细讲解创建型、结构型和行为型模式,并配以代码示例;第三部分通过自定义Spring的IOC功能综合案例,展示如何将常用设计模式应用于实际项目中。通过学习这些内容,读者可以提升编程能力,提高代码的可维护性和复用性。
4006 1
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
|
设计模式 Java 关系型数据库
设计模式——设计模式简介和七大原则
设计模式的目的和核心原则、单一职责原则、接口隔离原则、依赖倒转原则、里氏替换原则、开闭原则、迪米特法则、合成复用原则
设计模式——设计模式简介和七大原则
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
326 2
|
设计模式 微服务
设计模式问题之在软件设计中,“模块”如何定义和区分
设计模式问题之在软件设计中,“模块”如何定义和区分
207 0
|
设计模式 算法 开发者
设计模式问题之最小知识原则(迪米特法则)对代码设计有何影响,如何解决
设计模式问题之最小知识原则(迪米特法则)对代码设计有何影响,如何解决
228 0
|
设计模式 前端开发 JavaScript
React开发设计模式及原则概念问题之什么是HOC(Higher-order component),HOC遵循的设计原则都有哪些
React开发设计模式及原则概念问题之什么是HOC(Higher-order component),HOC遵循的设计原则都有哪些
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
366 16