架构师第二周

用户头像
麻辣
关注
发布于: 2020 年 06 月 17 日

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



好莱坞原则:Don't call me, I'll call you.

一般的使用场景是低层(框架)调用高层(业务)的过程。常用的实现技术是依赖注入和依赖查找。无论是依赖注入还是依赖查找,指的是低层找到高层的过程。通常的做法是:

1. 低层定义抽象,并面向抽象进行编码。

2. 高层实现抽象,完成实际的业务过程。



这也恰好符合了依赖倒置原则的要求:



1. 高层不依赖低层,他们都依赖抽象。

2.抽象不依赖具体,具体依赖抽象。



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



golang 著名的http框架 fasthttp(github 12k stars), 主要流程实现方式:

1. 业务逻辑实现定义为一个抽象RequestHandler

type RequestHandler func(ctx *RequestCtx)



2. 业务方法(高层)实现该抽象RequestHander

//实现RequestHander
m := func(ctx *fasthttp.RequestCtx) {
switch string(ctx.Path()) {
case "/foo":
fooHandlerFunc(ctx)
case "/bar":
barHandlerFunc(ctx)
case "/baz":
bazHandler.HandlerFunc(ctx)
default:
ctx.Error("not found", fasthttp.StatusNotFound)
}
}
//开始
fasthttp.ListenAndServe(":80", m)



3. 框架(低层)主要逻辑Server,通过WorkerPool间接依赖于RequestHandler

Server --------> WorkerPool -------> RequestHandler

type ServeHandler func(c net.Conn) error
type workerPool struct {
// Function for serving server connections.
// It must leave c unclosed.
WorkerFunc ServeHandler
MaxWorkersCount int
.....
}
type Server struct {
Handler RequestHandler
func (s *Server) Serve(ln net.Listener) {
wp := &WorkerPool{
WorkerFunc: s.serveConn,
MaxWorkersCount: maxWorkersCount,
LogAllErrors: s.LogAllErrors,
Logger: s.logger(),
connState: s.setState,
}
c, err = acceptConn(s, ln, &lastPerIPErrorTime)
wp.Serve(c)
}
}
func ListenAndServe(addr string, handler RequestHandler) error {
s := &Server{
Handler: handler,
}
return s.ListenAndServe(addr)
}



总结:

fasthttp框架,低层定义RequestHandler, 业务(高层)实现RequestHandler,满足了依赖倒置的原则

1. 高层不依赖低层,他们都依赖抽象。

2.抽象不依赖具体,具体依赖抽象。



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







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

麻辣

关注

还未添加个人签名 2018.10.13 加入

还未添加个人简介

评论

发布
暂无评论
架构师第二周