关于对象实例化接口,配置信息直接放在接口实现里面会不会更好一些
前面 sms 章节学习的时候就有这个疑惑了,今天想提出来分享讨论一下:
为啥在定义接口的时候,要把接口实现的相关配置当做参数传递进去?
在实现接口的函数中直接获取相应参数配置会不会好一些,调用的人一般不关心后面接口实现部分是怎么做的吧?在mailer实例化的时候已经知道了是 SMTP 实现的,为啥还要再传一个参数过去呢?
下面是教程里面的代码
接口定义:
package mail
type Driver interface {
// 检查验证码
Send(email Email, config map[string]string) bool
}
接口实现:
...
// SMTP 实现 email.Driver interface
type SMTP struct{}
// Send 实现 email.Driver interface 的 Send 方法
func (s *SMTP) Send(email Email, config map[string]string) bool {
...
err := e.Send(
fmt.Sprintf("%v:%v", config["host"], config["port"]),
smtp.PlainAuth(
"",
config["username"],
config["password"],
config["host"],
),
)
...
}
最后是 mail er 实例调用接口方法:
// NewMailer 单例模式获取
func NewMailer() *Mailer {
once.Do(func() {
internalMailer = &Mailer{
Driver: &SMTP{},
}
})
return internalMailer
}
func (mailer *Mailer) Send(email Email) bool {
return mailer.Driver.Send(email, config.GetStringMapString("mail.smtp"))
}
期待大家的看法,谢谢!