func (a *getLengthCm) getLength(m float64) float64 {
return m * 10
}
// 适配器
type LengthAdapter interface {
getLength(string, float64) float64
}
func NewLengthAdapter() LengthAdapter {
return &getLengthAdapter{}
}
type getLengthAdapter struct{}
func (*getLengthAdapter) getLength(isType string, into float64) float64 {
if isType == "m" {
return NewM().getLength(into)
}
return NewCm().getLength(into)
}
复制代码
桥接模式Bridge
假设一开始业务需要两种发送信息的渠道,sms和email,我们可以分别实现sms和email两个接口。之后随着业务迭代,又产生了新的需求,需要提供两种系统发送方式,systemA和systemB,并且这两种系统发送方式都应该支持sms和email渠道。
此时至少需要提供4种方法:systemA to sms,systemA to email,systemB to sms,systemB to email。
其实之前我们是在用继承的想法来看题目,桥接模式则盼望将继承关系变化为关联关系,使两个类独立存在。
详细:
桥接模式需要将抽象和实现区分开;
桥接模式需要将“渠道”和“系统发送方式”这两种种别区分开;
最后在“系统发送方式”的类里调用“渠道”的抽象接口,使他们从继承关系变化为关联关系。
用一句话总结桥接模式的理念,就是:“将抽象与实现解耦,将不同种别的继承关系改为关联关系。 ”
package bridge
import "fmt"
// 两种发送消息的方法
type SendMessage interface {
send(text, to string)
}
type sms struct{}
func NewSms() SendMessage {
return &sms{}
}
func (*sms) send(text, to string) {
fmt.Println(fmt.Sprintf("send %s to %s sms", text, to))
}
type email struct{}
func NewEmail() SendMessage {
return &email{}
}
func (*email) send(text, to string) {
fmt.Println(fmt.Sprintf("send %s to %s email", text, to))