《架构训练营》week2 作业

用户头像
任鑫
关注
发布于: 2020 年 06 月 17 日
《架构训练营》week2 作业

封面图片:杭州滨江浦沿镇信诚路、闻涛路

作业一:️请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?

一般情况下,我们未经良好设计的代码编写是“高层”调用“低层”,因此一般是“高层”的类或方法需要持有“低层”的类的对象,在类的依赖关系上就产生了“高层”对“低层”的依赖,而依赖倒置原则与此不同,在高层代码的编写过程中,我们需要对整个业务流程的结构或者说骨架进行抽象,抽象的结果就是一些功能接口,而不定义具体细节。低层通过实现高层定义的抽象接口来完成具体逻辑,这样依赖关系就变成低层依赖高层的抽象接口,因而称之为依赖倒置。这里的关键是对业务逻辑的 抽象,因此前述的所谓“高层依赖定低”并不完全准确,更加准确的描述是:无论高层低层,实现都依赖抽象。如果我们写代码不是想到哪写到哪,而是使用事先设计抽象出模型的话,应该就会写出符合依赖倒置模型的代码。

好莱坞原则就是,别找大佬,等大佬有事才找你,没事你就在池子里等着大佬有需要把你从池子里把你捞出来做成一盘菜,很显然这池子就是容器,大佬拥有支配池子和池子里的你的权利。核心是大佬很清楚自己要干啥,然后有需要再派活给别人。

作业二:请描述一个你熟悉的框架,是如何实现依赖倒置原则的

  1. 线程池,线程池定义了一套初始化、提交任务、执行任务、关闭的逻辑,其中的提交任务抽象为提交一个Runnable接口抽象,具体的执行逻辑,需要使用者去实现run方法。

  2. Servlet规范,Servlet规范定义了Servlet接口,规定所有网络请求到达后,后端程序的处理逻辑都必须编写为实现了Servlet接口的类,其中最为重要的service方法,请求处理和响应逻辑在该方法中实现。

public interface Servlet {
void init(ServletConfig config) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;
String getServletInfo();
void destroy();
}

而Servlet容器就将网络请求封装成ServletRequest对象,再调用容器中的Servlet实现,最后再将ServletResponse处理为网络响应写出;此外还定义了Filter和Listener来扩展Servlet,使用者只需要实现这两个接口并将其加入Servlet容器就能完成扩展功能的调用。

  1. Spring的事件监听机制:Spring在框架层面定义了ApplicationEvent类,和ApplicationListener这个泛型接口,泛型参数表示要监听的事件类型,使用者只需要继承ApplicationEvent以定义自己的事件,实现ApplicationListener接口并向Spring容器注册该监听器,在调用applicationContext发布自定义的事件时,Spring容器会在已经委托容器管理的监听器中选择泛型参数为发布事件类型的监听器的监听方法加以调用。这是典型的由Spring框架高层定义抽象,由使用者实现接口,后由容器调度执行的例子。

此类例子很多,比如流式计算框架Storm抽象定义了一套计算骨架,使用者主要是实现其定义的任务计算接口,并提交,就可以完成包括计算资源分配、计算、实时输出计算结果等过程。

作业三:请用接口隔离原则优化 Cache 类的设计,画出优化后的类图



原图:Cache中有两类方法,一类是用来操作缓存的增、删、改,另一个是重新构造缓存,显然这两类方法的调用者不同,但密切相关出于结构功能紧凑、内聚的考虑,需要将这些方法放置在同一个类中。

改进后:为避免将方法暴露给不需要的调用者,造成诸如误调等错误,需要使用不同的接口做“接口隔离”,类图如下



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

任鑫

关注

还未添加个人签名 2018.05.26 加入

还未添加个人简介

评论

发布
暂无评论
《架构训练营》week2 作业