当前位置: 首页 > 后端技术 > Java

DependenceInversionPrincipleofSoftwareArchitectureDesignPrinciple

时间:2023-04-02 00:54:13 Java

依赖倒置原则(DependenceInversionPrinciple,DIP)是指在设计代码结构时,高层模块不应该依赖低层模块,两者都应该依赖于它们的抽象。抽象不应该依赖于细节,细节应该依赖于抽象。通过依赖倒置,可以降低类之间的耦合度,提高系统的稳定性,提高代码的可读性和可维护性,降低修改程序带来的风险。接下来,我们来看一个案例。让我们以课程为例。我们先创建一个类Tom:publicclassTom{publicvoidstudyJavaCourse(){System.out.println("TomislearningJavacourses");}publicvoidstudyPythonCourse(){System.out.println("TomislearningPythoncourse");}}调用:publicstaticvoidmain(String[]args){Tomtom=newTom();tom.studyJavaCourse();tom.studyPythonCourse();}Tom热爱学习,目前正在学习Java课程和Python课程。我们都知道学习会让人上瘾。随着学习兴趣的“飙升”,汤姆现在也想学习AI(人工智能)课程。此时由于业务扩展,需要从低层到高层(调用层)依次修改代码。在Tom类中添加studyAICourse()方法,并在高层调用它。这样一来,系统发布后,其实是很不稳定的,在修改代码的同时会带来意想不到的风险。接下来优化代码,创建一个课程的抽象ICourse接口:publicinterfaceICourse{voidstudy();}然后编写JavaCourse类:publicclassJavaCourseimplementsICourse{@Overridepublicvoidstudy(){System.out.println("汤姆正在学习Java课程");}}再次实现PythonCourse类:publicclassPythonCourseimplementsICourse{@Overridepublicvoidstudy(){System.out.println("TomisstudyingaPythoncourse");}}修改Tom类:publicclassTom{publicvoidstudy(ICoursecourse){course.study();}}查看调用代码:publicstaticvoidmain(String[]args){Tomtom=newTom();tom.study(新JavaCourse());tom.study(newPythonCourse());}这时候再看代码,不管Tom的兴趣如何飙升,对于新课程,只需要新建一个类,通过传参的方式告诉Tom,而不是需要修改底层代码。其实这是一种很熟悉的方式,叫做依赖注入。还有用于注入的构造函数和setter方法。再看构造函数注入方式:publicclassTom{privateICoursecourse;公共汤姆(ICourse课程){this.course=course;}publicvoidstudy(){course.study();}}查看调用代码:publicstaticvoidmain(String[]args){Tomtom=newTom(newJavaCourse());tom.study();}根据构造函数的注入方式,每次调用都要创建一个实例。如果Tom是全局单例,我们只能选择使用Setter方法注入,继续修改Tom类的代码:publicclassTom{privateICoursecourse;publicvoidsetCourse(ICoursecourse){this.course=course;}publicvoidstudy(){course.study();}}查看调用代码:publicstaticvoidmain(String[]args){Tomtom=newTom();tom.setCourse(newJavaCourse());汤姆.研究();tom.setCourse(新的PythonCourse());tom.study();}下面我们来看最终的类图,如下图所示。大家要记住,基于抽象的架构要比基于细节的架构稳定得多。因此,在获取需求后,需要针对界面进行编程,先在顶层设计代码结构,再进行细节设计。本文为《汤姆炸弹建筑》原创,转载请注明出处。科技在于分享,我分享我的快乐!如果本文对您有帮助,请关注并点赞;有什么建议也可以留言或私信。您的支持是我坚持创作的动力。关注微信公众号“汤姆炸弹架构”,获取更多技术干货!【推荐】汤姆炸弹架构:收藏本文相当于收藏一本《设计模式》书接口隔离原则(InterfaceSegregationPrinciple,ISP)Tombo架构:Dimiter原则(LawofDemeterLoD)Tombo架构:LiskovSubstitutionPrinciple(LSP)Tombo架构:综合重用原则(Composite/AggregateReusePrinciple,CARP)