【架构师训练营】week 2 homework

发布于: 2020 年 06 月 17 日
【架构师训练营】week 2 homework

问题一

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

1. 依赖倒置原则

在面向对象编程领域中,依赖倒置原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。该原则规定:

  1. 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口。

  2. 抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。

(来自维基百科)

2. 好莱坞原则

“Don‘t call me, I'll call you”就是著名的好莱坞原则。在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。梦想进入好莱坞的人们,不要找好莱坞,等好莱坞来找你。

好莱坞原则的核心思想和大多数框架的设计思想是一致的:要让框架调用程序,而不是程序调用框架。而这其实就是依赖倒置原则的体现。

问题二

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

1. Tomcat 的原理

Tomcat 是运行 Java Web 应用程序的容器。我们编写的 Web 应用程序代码只需要部署在 Tomcat 容器下,便可以被 Tomcat 容器调用执行。按照之前的划分原则,Tomcat 就是高层模块,我们编写的 Web 应用程序代码就是低层模块。Tomcat 和应用程序代码之间并没有直接的依赖关系,两者都依赖同一个“抽象”,也就是 Servlet 规范。Servlet 规范不依赖具体的 Tomcat 容器和应用程序的实现细节,而 Tomcat 容器和应用程序依赖 Servlet 规范。

2. Java Spring

Spring 的两大特性是控制反转(IOC,Inversion of Control)和依赖注入(DI,Dependency Injection)。

在控制反转中,“控制”指的是对程序执行流程的控制,“反转”指的是在没有使用框架之前,程序员自己控制整个程序的执行。在使用框架之后,整个程序的执行流程可以通过框架来控制。流程的控制权从程序员“反转”到了框架。

而依赖注入与控制反转不同,依赖注入是一种具体的编码技巧。依赖注入是指:不通过 new() 的方式在类内部创建依赖类对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类使用。在Spring中,只需要在上下文中配置要创建的类对象、类与类之间的依赖关系,框架便可以完成自动创建对象、管理对象的生命周期、依赖注入等原本需要程序员来做的事情。

总结:Spring 不需要依赖于具体的业务实现,而具体实现需要依赖 Spring(抽象)。

问题三

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

提示:cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法。

1. 接口隔离原则定义

接口隔离原则(ISP,Interface Segregation Principle),定义为 “ Clients should not be forced to depend upon interfaces that they do not use。”,即客户端不应该被强迫依赖它不需要的接口。其中的“客户端”,可以理解为接口的调用者或者使用者。

2. 代码实现

public interface AppServer{
Object get(Object key);
void put(Object key,Object value);
void delete(Object key);
}
public interface RemoteServer{
void reBuild(Config conf);
}
//应用程序实现
public class AppCache implements AppServer{
//...省略实现
}
//系统端实现
public class SysCache implements AppServer,RemoteServer{
//...省略实现
}

3.类图

用户头像

eazonshaw

关注

还未添加个人签名 2019.04.10 加入

还未添加个人简介

评论

发布
暂无评论
【架构师训练营】week 2 homework