1.需要jdk17准备1Spring6,idea2022.*版本2.OCP开闭原则42.1什么是OCP?4
OCP是软件七大开发原则中最基本的原则:开闭原则
对什么开放?对扩张开放。
什么是关闭?关闭修改。
OCP原则是最核心、最基本的,其他六个原则都是为这一原则服务的。
2.2OCP开闭原则的核心是什么?4只要您在扩展系统功能时没有修改以前编写的代码,您就符合OCP原则。
相反,如果您在扩展系统功能时修改了以前的代码,则该设计失败,违反了OCP原则。当系统功能扩展时,如果您移动了以前稳定的程序并修改了以前的程序,则需要重新测试以前的所有程序。我不想看到它,因为它很麻烦。
3.依赖倒置原则(DIP原则)5 3.1依赖倒置的原则是什么?5面向接口编程,面向抽象编程,不面向具体编程。
3.2依赖倒置原则的目的?5降低程序耦合度,提高扩展性。
3.3什么叫依赖倒置?5.上不依赖下,就是符合。
3.4什么是违反依赖倒置?5.上依赖下,就是违背。
只要“下”改变,“上”就会牵连。
4.Spring启示录34.1阅读以下代码3-4com.powernode.spring6.dao持久层接口Userdaodao
package com.powernode.spring6.dao;//持久层 3public interface UserDao { /////用户信息根据id删除 3 void deleteById();}
com.powernode.spring6.dao.实现类UserdaoimplForMySQL持久层
package com.powernode.spring6.dao.impl;import com.powernode.spring6.dao.UserDao;/** * 实现mysql的持久层类 3 **/public class UserDaoImplForMySQL implements UserDao { @Override public void deleteById() { System.out.println(MySQL数据库正在删除用户信息..."); }}
实现类UserDaoImplForOracler
可以看出,UserdaoimplFormySQL主要连接MySQL数据库进行操作。如果更换到Oracle数据库,则需要提供另一个UserdaoimplForacle,如下:
package com.powernode.spring6.dao.impl;import com.powernode.spring6.dao.UserDao;/*** oracle的持久层实现类 4 **/public class UserDaoImplForOracle implements UserDao { @Override public void deleteById() { System.out.println(”Oracle数据库正在删除用户数据..."); }}
com.powernode.spring6.UserServiceservice业务层接口
package com.powernode.spring6.service;/** * 业务层 3 **/public interface UserService { /** * 删除用户信息 */ void deleteUser();}
com.powernode.spring6.service.impl业务层实现了Userserviceimpllepl
package com.powernode.spring6.service.impl;import com.powernode.spring6.dao.UserDao;import com.powernode.spring6.dao.impl.UserDaoImplForMySQL;import com.powernode.spring6.dao.impl.UserDaoImplForOracle;import com.powernode.spring6.service.UserService;/** * 业务层实现类 3 **/public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImplForMySQL(); @Override public void deleteUser() { userDao.deleteById(); }}
com.powernode.spring6.web表示UserAction
package com.powernode.spring6.web;import com.powernode.spring6.service.UserService;import com.powernode.spring6.service.impl.UserServiceImpl;/** * 表示层 3 **/public class UserAction { private UserService userService = new UserServiceImpl(); // 修改为 //private UserService userService; /** * 删除用户信息请求 3 */ public void deleteRequest(){ userService.deleteUser(); }}
显然,上述操作正在扩展功能,并添加了一个新的UserdaoimplForacle来应对数据库的变化。这里的变化会引起连锁反应吗?当然,如果您想切换到Oracle数据库,需要修改Userserviceimpl代码,如下:
public class UserServiceImpl implements UserService { //private UserDao userDao = new UserDaoImplForMySQL(); // 修改为oracle 4 private UserDao userDao = new UserDaoImplForOracle(); //private UserDao userDao; @Override public void deleteUser() { userDao.deleteById(); }}
com.powernode.spring6.Testttttttetclient测试
package com.powernode.spring6.client;import com.powernode.spring6.web.UserAction;//负责测试 3public class Test { public static void main(String[] args) { UserAction userAction = new UserAction(); userAction.deleteRequest(); }}
4.2分析问题5
这样,OCP违反了开闭原则。开闭原则是这样说的:在软件开发过程中,要对扩展开放,对修改关闭。也就是说,如果在功能扩展中添加额外的类别没有问题,但由于功能扩展而修改以前的正常程序是禁忌和不允许的。因为一旦正常程序在修改前运行,整个项目将进行全面的重新测试。这是一个非常麻烦的过程。上述问题的主要原因是代码和代码之间的耦合度过高。如下图所示:
可以清楚地看到,上层是依赖下层是的。Usercontroller依赖于Userserviceimpl,而Userserviceimpl依赖于UserdaoimplformySQL,这将导致只需更改下面的内容,以上必然会牵连(也会随之改变),所谓牵一发,动全身。这也违反了另一个发展原则:依靠倒置原则。
目前的程序设计显然违反了OCP和DIP。我该怎么办?
这个问题可以通过编程思想“控制反转”来解决。
5.控制反转是什么?6控制反转:IoC(InversionofControl)
5.1反转是什么?6.1反转?逆转是两件事:
第一件事:我不在程序中使用硬编码来new对象。(我不在乎new对象,new对象的权利已经交出。)
第二件事:我不会在程序中使用硬编码来维护对象之间的关系。(我不在乎对象之间关系的维护权。我把它交出去了。)
控制逆转:是一种编程理念。或者是一种新的设计模式。由于其出现相对较新,不包括在GoF23设计模式中。
6.Spring框架7*Spring框架实现了控制反转IOC的思想
Spring框架可以帮助您new对象。
Spring框架可以帮助您维护对象和对象之间的关系。
*Spring是实现IoC思想的容器。
控制反转的实现方法有很多,其中更重要的是:依赖注入(DependencyInjection,简称DI)。
*控制反转是思想。依靠注入是这种思想的具体实现。
6.1依赖于DI注入,包括两种常见的方法:7.1第一种:set注入(执行set方法赋值属性)
二是注入结构方法(执行结构方法赋予属性赋值)
6.2依赖注入中的“依赖”是什么意思?“注入”是什么意思?依赖:A对象与B对象的关系。
注:这是一种手段,可以使A对象与B对象有关。
依赖注入:对象A和对象B之间的关系通过注入来维持。注入包括:set注入和结构注入。
7.注意术语:8OCP:开闭原则(开发原则)
DIP:依靠倒置原则(开发原则)
IoC:控制反转(一种思想,一种新的设计模式)
DI:依靠注入(控制反转思想的具体实现方式)