type MailSender interface {
SendMail(to string, subject string, body string) error
}
然后定义外部邮件服务的接口:
type ExternalMailSender interface {
SendEmail(address string, subject string, body string) error
}
创建一个适配器类型,实现 MailSender 接口:
type ExternalMailSenderAdapter struct {
externalMailSender ExternalMailSender
}
func (a ExternalMailSenderAdapter) SendMail(to string, subject string, body string) error {
return a.externalMailSender.SendEmail(to, subject, body)
}
这个适配器类型将外部邮件服务的接口适配成了内部系统需要的接口,通过调用外部邮件服务的 SendEmail 方法来实现 SendMail 方法。
现在,内部系统就可以使用 ExternalMailSenderAdapter 类型来发送邮件,而不需要关心外部邮件服务的具体实现。
func sendEmail(ms MailSender) {
err := ms.SendMail("user@example.com", "Test email", "This is a test email.")
if err != nil {
log.Println("Error sending email:", err)
}
}
func main() {
// 创建外部邮件服务的实例
externalMailSender := NewExternalMailSender()
// 将外部邮件服务的接口适配成内部系统需要的接口
mailSender := ExternalMailSenderAdapter{
externalMailSender: externalMailSender,
}
// 发送邮件
sendEmail(mailSender)
}
在这个示例中,适配器模式被用来将一个外部服务的接口适配成内部系统的接口。通过这种方式,内部系统就可以使用适配后的接口来调用外部服务,而不需要修改内部系统的代码。适配器模式可以让系统更加灵活,降低耦合度,使系统更容易扩展和维护。