go design pattern
高层次的类不应该依赖于低层次的类,两者都应该依赖于抽象接口。抽象接口不应该依赖具体实现,具体实现应该依赖于抽象接口。
低层次的类实现基础操作,高层次的类实现复杂业务逻辑。
假如有一个邮件通知系统
type EmailNotification struct{}
func (e *EmailNotification) SendEmail(message string) {
fmt.Println("Send email: ", message)
}
type User struct {
emailNotification *EmailNotification
}
func (u *User) Notify(email string) {
u.emailNotification.SendEmail(email)
}
这里User
类依赖于EmailNotification
类,如果我们需要更换通知方式,那么我们必须修改User
类。
type Notification interface {
Send(message string)
}
type ModifyEmailNotification struct{}
func (m *ModifyEmailNotification) Send(message string) {
fmt.Println("Send email: ", message)
}
type ModifyUser struct {
notification Notification
}
func (m *ModifyUser) Notify(email string) {
m.notification.Send(email)
}
定义了一个Notification
接口,User
类依赖于Notification
接口,这样当我们需要更换通知方式时,只需要实现Notification
接口即可。