面向对象编程原则

用户头像
asd945
关注
发布于: 2020 年 06 月 17 日
  1. 描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?

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

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



依赖倒置原则



依赖倒置(Dependence Inversion Principle),又名DIP。在维基百科中的定义是这样的:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions。



这句话的意思:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。其实这也不难理解,模块之间的调用的依赖通过抽象之间来实现,实现类之间没有直接的依赖关系,其依赖关系通过接口产生;接口不依赖实现类,而实现类依赖接口。从某种程度上,就是强内聚,松耦合的一种表现形式。



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



在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。如果从一个框架的角度看,所有的组件都是被框架所调用,所有的组件都是被动的,所以有时候依赖倒置原则也称为好莱坞原则。

golang的依赖倒置



golang不是一门纯正的面向对象语言,但是具备了实现面向对象的特性。interface接口在golang中各种存在。且golang的面向对象更像是一种赶鸭子模型。像下面这两个interface,几乎是go语言中被实现得最多的interface之一了。

// go/src/net/http/server.go
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
// go/src/io/io.go
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}



同样,go的这种特性还是比广泛应用在一些框架中。比如,gin框架的IORouter路由处理类。

type IRouter interface {
IRoutes
Group(string, ...HandlerFunc) *RouterGroup
}
// IRoutes defines all router handle interface.
type IRoutes interface {
Use(...HandlerFunc) IRoutes
Handle(string, string, ...HandlerFunc) IRoutes
Any(string, ...HandlerFunc) IRoutes
GET(string, ...HandlerFunc) IRoutes
POST(string, ...HandlerFunc) IRoutes
DELETE(string, ...HandlerFunc) IRoutes
PATCH(string, ...HandlerFunc) IRoutes
PUT(string, ...HandlerFunc) IRoutes
OPTIONS(string, ...HandlerFunc) IRoutes
HEAD(string, ...HandlerFunc) IRoutes
StaticFile(string, string) IRoutes
Static(string, string) IRoutes
StaticFS(string, http.FileSystem) IRoutes
}

他们依赖接口的抽象,并不依赖具体的实现。而具体的业务只需要实现HandlerFunc这个接口就能被调用。

g := gin.New()
g.GET("/", func(context *gin.Context) {
context.String(http.StatusForbidden, "permission denied!")
})



这是不是和前面所说的DIP有异曲同工之处呢。

接口隔离原则优化Cache类的设计



type CacheInf interface {
Get(key string) interface
Put(Key string, value interface) error
Delete(key string) error
}
type Cache struct {
CacheInf
Conf
}
type (c *Cache) Rebuild(conf Conf) {
c.CacheInf = Rebuild(conf)
}
// 工厂函数
func Rebuild(conf Conf) CacheInf {
return ...
}
type Conf struct {
DSN string
}
type RedisCache struct {
}
// implement CacheInf...
type MemCache struct {
}
// implement CacheInf...





用户头像

asd945

关注

还未添加个人签名 2018.06.21 加入

还未添加个人简介

评论

发布
暂无评论
面向对象编程原则