架构师训练营 - 软件设计原则

用户头像
Pontus
关注
发布于: 2020 年 06 月 16 日

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



  • 高层不依赖于低层,低层也不依赖于高层,都依赖于抽象,而不依赖具体实现,由使用者来定义自己需要的接口

  • service(低层)定义接口,controller(高层)去实现接口,这不属于依赖倒置

  • controller定义自己的抽象,service去实现抽象,这是依赖倒置

  • 常应用于框架的开发,使用框架时不需要调用框架提供的代码,针对框架提供的接口进行编程,框架通过接口调用我们的代码

  • 架构师开发框架,制定规范,让别人依赖此规范进行开发

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



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



Go语言依赖包导入

  • 抽象不应依赖于实现细节,实现细节应该依赖于抽象。 – Robert C. Martin

  • 在 Go 语言中,依赖倒置可以体现在依赖导入的结构。

  • 依赖导入结构必须是非循环的,不遵守此约定的后果是可能会导致编译错误,但是更为严重的是设计上的错误。

  • 良好的依赖导入结构因该是平坦的,而不是层次结构很深。如果你有一个包,在没有其他包的情况下,不能正常工作,这可能你的代码包的组织结构没有划分好边界。

  • 依赖倒置原则鼓励你将具体实现细节尽可能的放到依赖导入结构的最顶层,在 main package 或者更高层级的处理程序中,让低层级的代码去处理抽象的接口。



Tomcat容器

  • Tomcat 是运行 Java Web 应用程序的容器。

  • 我们编写的 Web 应用程序代码只需要部署在 Tomcat 容器下,便可以被 Tomcat 容器调用执行。

  • 按照之前的划分原则,Tomcat 就是高层模块,我们编写的 Web 应用程序代码就是低层模块。

  • Tomcat 和应用程序代码之间并没有直接的依赖关系,两者都依赖同一个“抽象”,也就是 Servlet 规范。

  • Servlet 规范不依赖具体的 Tomcat 容器和应用程序的实现细节,而 Tomcat 容器和应用程序依赖 Servlet 规范。

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



class Cache {
Object get(Object key)
void put(Object key, Object value)
void delete(Object key)
void reBuild(Config conf)
}




  • cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。

  • 如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。

  • 按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。

  • 也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。

  • 从而实现接口隔离,使应用程序看不到 rebuild 方法。







用户头像

Pontus

关注

还未添加个人签名 2018.04.21 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 - 软件设计原则