首页 > 其他分享 >Spring之OCP开闭原则和DIP依赖倒置原则

Spring之OCP开闭原则和DIP依赖倒置原则

时间:2024-11-20 22:42:17浏览次数:1  
标签:UserServiceImpl 原则 Spring com OCP DIP spring6 public xu

通过如下代码,来分析几个开发原则(OCP开闭原则和DIP依赖倒置原则)

代码结构

image-20241120221417503

1.Test类

package com.xu.spring6.client;

import com.xu.spring6.web.UserAction;

public class Test {
    public static void main(String[] args) {
        UserAction userAction = new UserAction();
        userAction.deleteUser();
    }
}

2.UserAction类

package com.xu.spring6.web;

import com.xu.spring6.service.UserService;
import com.xu.spring6.service.impl.UserServiceImpl;

public class UserAction {
    private UserService userService = new UserServiceImpl();

    public void deleteUser(){
        userService.deleteUser();
    }
}

3.UserService接口和UserServiceImpl实现类

package com.xu.spring6.service;

public interface UserService {
    void deleteUser();
}
package com.xu.spring6.service.impl;

import com.xu.spring6.dao.UserDao;
import com.xu.spring6.dao.impl.UserDaoImplForMySQL;
import com.xu.spring6.service.UserService;

public class UserServiceImpl implements UserService {
    private UserDao userDao = new UserDaoImplForMySQL();

    @Override
    public void deleteUser() {
        userDao.deleteUser();
    }
}

4.UserDao接口和UserDaoImplForMySQL实现类

package com.xu.spring6.dao;

public interface UserDao {
    void deleteUser();
}
package com.xu.spring6.dao.impl;

import com.xu.spring6.dao.UserDao;

public class UserDaoImplForMySQL implements UserDao {

    @Override
    public void deleteUser() {
        System.out.println("正在删除用户信息~");
    }
}

分析上述代码存在问题

UserAction类中用到了private UserService userService = new UserServiceImpl();

UserServiceImpl实现类中用到了private UserDao userDao = new UserDaoImplForMySQL();

如果现在,我想从MySQL(UserDaoImplForMySQL)切换到Oracle(UserDaoImplForOracle),那么我就必须修改UserServiceImpl类的代码,将声明成员变量userDao的代码改为如下:

private UserDao userDao = new UserDaoImplForOracle();

这个就违反了OCP开闭原则和DIP依赖倒置原则。

OCP开闭原则

开闭原则(Open-Closed Principle):简称OCP,在软件开发过程中应当对扩展开放,对修改关闭。也就是说,如果在进行功能扩展的时候,添加额外的类是没问题的,但因为功能扩展而修改之前运行正常的程序,这是不推荐的。因为一旦修改之前运行正常的程序,就会导致项目整体要进行全方位的重新测试。这是相当繁琐的过程。导致这个问题的主要原因是:代码和代码之间的耦合度太高。如下图所示:

image-20241120223531143

上层是依赖下层的。UserAction依赖UserServiceImpl,而UserServiceImpl依赖UserDaoImplForMySQL,这样就会导致下面只要改动上面必然会受牵连(跟着也会改),所谓牵一发而动全身。这个也同时违背了另一个开发原则:依赖倒置原则。

DIP依赖倒置原则

依赖倒置原则(Dependence Inversion Principle):简称DIP,主要倡导面向抽象编程,面向接口编程,不要面向具体编程,让上层不再依赖下层,下面改动了,上面的代码不会受到牵连。这样可以大大降低程序的耦合度,耦合度低了,扩展力就强了,同时代码复用性也会增强。(软件七大开发原则都是在为解耦合服务

前面有问题的代码没有完全实现面向接口编程,因为代码中还是使用了接口的具体实现类。

image-20241120223937975

下面这种才算是完全的面向接口编程,符合依赖倒置原则。

image-20241120224101643

标签:UserServiceImpl,原则,Spring,com,OCP,DIP,spring6,public,xu
From: https://www.cnblogs.com/growingbambi/p/18559520

相关文章

  • 基于Java+Springboot+Jpa+Mysql实现的在线网盘文件分享系统功能设计与实现三
    一、前言介绍:免费学习:猿来入此1.1项目摘要在线网盘文件分享系统的课题背景主要源于现代社会对数字化信息存储和共享需求的日益增长。随着互联网的普及和技术的快速发展,人们越来越依赖电子设备来存储和传输各种类型的数据文件。然而,传统的本地存储方式存在诸多不便,如空间有限、......
  • Spring中使用BeanUtils.copyProperties()导致Hessian/Burlap:ClassNotFoundException
    背景遇到一个问题:dubbo服务客户端发现提示警告异常[NewI/Oworker#4]WARNc.a.c.c.hessian.io.SerializerFactory-Hessian/Burlap:'XX.XX.XBean'isanunknownclassinjava.net.URLClassLoader@988246e:java.lang.ClassNotFoundException:XX.XX.XBean但是根据代码......
  • SpringBoot在线网盘管理系统
    感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人2025最新毕业设计项目推荐-SSM篇2025最新毕业设计项目推荐-SpringBoot篇2025最新毕业设计项目推荐-小程序、uniapp篇-CSDN博客Java精品毕设实战案例推荐​在......
  • SpringBoot+小程序旅游景区管理系统
    感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人2025最新毕业设计项目推荐-SSM篇2025最新毕业设计项目推荐-SpringBoot篇2025最新毕业设计项目推荐-小程序、uniapp篇-CSDN博客Java精品毕设实战案例推荐​小......
  • SpringBoot+小程序的考研分享交流社区
    感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人2025最新毕业设计项目推荐-SSM篇2025最新毕业设计项目推荐-SpringBoot篇2025最新毕业设计项目推荐-小程序、uniapp篇-CSDN博客Java精品毕设实战案例推荐​小......
  • SpringBoot项目框架搭建日志相关容易被忽视的细节
    问题项目A、B,都基于SpringBoot技术栈开发。发现其中项目A在本地IDE启动时控制台会打印spring-webmvc里@Controller的mapping映射信息,其中一行如下:2024-11-2021:10:12[main:76835]-[INFO]org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$Mappi......
  • 基于java+springboot的hive的安顺旅游景点数据分析的设计与实现
    课题简介基于Java+SpringBoot和Hive的安顺旅游景点数据分析系统,全力挖掘安顺旅游数据宝藏。后端借SpringBoot构建,SpringDataJPA与MySQL存储关键信息,SpringSecurity筑牢安全防线。Hive存储海量景点数据,如客流、客源地、消费等,HiveQL深度分析挖掘价值。......
  • 基于java+springboot的Hadoop的豆瓣电子图书推荐系统
    课题简介基于Java+SpringBoot和Hadoop的豆瓣电子图书推荐系统,致力于为读者精准推送契合其兴趣的电子图书。后端运用SpringBoot构建稳固架构,SpringDataJPA与MySQL数据库协作存储图书信息、用户数据、评分记录等内容,SpringSecurity保障系统安全,规范用户认......
  • 基于springboot+vue的Java的航空飞机票务预约购票出行服务系统设计与实现(源码+文档+
    课题简介基于SpringBoot+Vue的航空飞机票务预约购票出行服务系统,为旅客提供一站式航空出行解决方案。后端采用SpringBoot构建核心服务,SpringDataJPA与MySQL数据库交互,存储航班信息、用户数据、订单详情等,SpringSecurity确保系统安全,进行严格的用户认证与......
  • Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
    Redisson是一个高性能的JavaRedis客户端,提供了丰富的分布式工具集,如分布式锁、Map、Queue等,帮助开发者简化Redis的操作。在集成Redisson到项目时,开发者通常有两种选择:使用Redisson原始依赖。使用RedissonSpringBootStarter。这篇文章将详细介绍这两种集成......