写点什么

架构师训练营 - 第 2 周命题作业

用户头像
红了哟
关注
发布于: 2020 年 06 月 20 日
架构师训练营 - 第 2 周命题作业

1.请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?



依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

依赖倒置原则更像是一种你应该养成的编程习惯,它要求你面对接口编程。

例子:类A,类B,类C,都有相同的属性,相同的方法,然后都有可能被类H调用(高层调用低层),这样H类的实例如果调用这三个类,那么这个类H就和这三个类就发生了耦合,但是如果把这三个类抽取出一个接口I,类H调用I(面向接口编程),H就依赖于接口,A、B、C也依赖于接口。好处是,在这种情况下,类与类之间的耦合降低了,不依赖具体类而是依赖于接口。



好莱坞原则:“不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”。

好莱坞原则是用在系统的高层组件与底层组件之间。高层组件不应该直接调用底层组件,而是从容器获取。

例子:假设qq在线聊天,有聊天框和表情选择框,那么,打开聊天框,然后打开表情框,选择表情——这个过程不应该在聊天框的代码里出现(或者说,聊天框不应该参与直接调用表情框),而是应该聊天框告诉qq容器:我要调用A,虽然我不知道那是什么,然后容器提供A(表情框组件)。好处是,假如之后腾讯更新了更好的表情框,然后由容器控制生命周期,而聊天框则不参与。



好莱坞原则定义接口倒转的层次依赖关系,跟依赖倒置原则同理相通。


2.请描述一个你熟悉的框架,是如何实现依赖倒置原则的。



举例:spring框架定义好了拦截器接口,需要使用的时候我们需要遵循框架定义的拦截器接口,实现接口中的方法。典型的高层定义接口,底层根据高层定义好的接口来进行开发实现。



取自spring框架拦截器框架源码:

package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception;
void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;
}



取自我们实现需要使用的拦截器代码:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DemoInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//todo something
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//todo something
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
//todo something
}
}



配置在xxx.xml文件中进行使用

<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/api/demo/demo"/>
<bean class="com.demo.demo.demo.interceptor.DemoInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>






3.请用接口隔离原则优化Cache类的设计,画出优化后的类图。



Config:

public interface Config {
}

ManagerCache:

public interface ManagerCache {
void reBuild(Config conf);
}

GeneralCache:

public interface GeneralCache {
Object get(Object key);
void put(Object key,Object value);
void delete(Object key);
}

GeneralAndManagerCacheImpl:

public class GeneralAndManagerCacheImpl implements GeneralCache,ManagerCache{
@Override
public Object get(Object key) {
return null;
}

@Override
public void put(Object key, Object value) {

}

@Override
public void delete(Object key) {

}

@Override
public void reBuild(Config conf) {

}
}

类图:



使用的时候,只开发两个接口单独开放,底层实现是两个cache的接口的方法都实现,需要使用这2个接口的时候都注入这个实现类的实例对象,这样就做到了接口隔离方法隔离。

发布于: 2020 年 06 月 20 日阅读数: 137
用户头像

红了哟

关注

还未添加个人签名 2019.08.15 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 - 第 2 周命题作业