第二周作业
一、请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
依赖倒置原则:Dependency Inversion Principle;DIP
高层模块不应该依赖于低层模块,二者都应该依赖于抽象;
抽象不应该依赖于细节,细节应该依赖于抽象。
该原则是框架(framework)设计的核心原则
每个较高层次都为它所需要的服务声明一个抽象接口,较低的层次实现了这些抽象接口。每个高层类都通过该抽象接口使用下一层,这样高层就不依赖于低层,低层反而依赖于在高层中声明的抽象服务接口。
低层模块实现了在高层模块中声明并被高层模块调用的接口。
要依赖于抽象,程序中所有的依赖关系都应该终止于抽象类或者接口。
任务变量都不应该持有一个指向具体类的引用。
任何类都不应该从具体类派生。
任何方法都不应该重写它的任何基类中的已经实现了的方法。
依赖倒置可以应用于任何存在一个类向另一个类发送消息的地方。
使用何种语言来编写程序是无关紧要的。如果程序的依赖关系是倒置的,它就是面向对象的设计,如果程序的依赖关系不是倒置的,它就是过程化的设计。
二、请描述一个你熟悉的框架,是如何实现依赖倒置原则的。
所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。
所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取B的实例:B b = new B(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实例,比如工厂、Locator等等),然后你就可以调用b对象了。所以,不倒置,意味着A要主动获取B,才能使用B;到了这里,你就应该明白了倒置的意思了。倒置就是A要调用B的话,A并不需要主动获取B,而是由其它人自动将B送上门来。
形象的举例就是:通常情况下,假如你有一天在家里口渴了,要喝水,那么你可以到你小区的小卖部去,告诉他们,你需要一瓶水,然后小卖部给你一瓶水!这本来没有太大问题,关键是如果小卖部很远,那么你必须知道:从你家如何到小卖部;小卖部里是否有你需要的水;你还要考虑是否开着车去;等等等等,也许有太多的问题要考虑了。也就是说,为了一瓶水,你还可能需要依赖于车等等这些交通工具或别的工具,问题是不是变得复杂了?那么如何解决这个问题呢?解决这个问题的方法很简单:小卖部提供送货上门服务,凡是小卖部的会员,你只要告知小卖部你需要什么,小卖部将主动把货物给你送上门来!这样一来,你只需要做两件事情,你就可以活得更加轻松自在:第一:向小卖部注册为会员第二:告诉小卖部你需要什么是不是和Spring的做法很类似呢?Spring就是小卖部,你就是A对象,水就是B对象第一:在Spring中声明一个类:A第二:告诉Spring,A需要B假设A是UserAction类,而B是UserService类 在Spring这个商店(工厂)中,有很多对象/服务:userService,documentService,orgService,也有很多会员:userAction等等,声明userAction需要userService即可,Spring将通过你给它提供的通道主动把userService送上门来,因此UserAction的代码示例类似如下所示:package org.leadfar.web;public class UserAction{ private UserService userService; public String login(){ userService.valifyUser(xxx); } public void setUserService(UserService userService){ this.userService = userService; }}
在这段代码里面,你无需自己创建UserService对象(Spring作为背后无形的手,把UserService对象通过你定义的setUserService()方法把它主动送给了你,这就叫依赖注入!)
三、
评论