桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(interface)模式。
桥接模式的实现代码
package main
import "fmt"
//发送信息的具体实现(操作)
type MessageImplementer interface {
send(test, to string)
}
//发送SMS
type MessageSMS struct{}
func (*MessageSMS) send(test, to string) {
fmt.Printf("SMS信息:[%v];发送到:[%v]\n", test, to)
}
func ViaSMS() *MessageSMS { //创建
return &MessageSMS{}
}
//发送email
type MessageEmail struct{}
func (*MessageEmail) send(test, to string) {
fmt.Printf("Email信息:[%v];发送到:[%v]\n", test, to)
}
func ViaEmail() *MessageEmail{//创建
return &MessageEmail{}
}
//发送信息的二次封装(发送普通信息、紧急信息)
type AbstractMessage interface {
SendMessage(text, to string)
}
//普通信息
type CommonMessage struct {
method MessageImplementer
}
func (c *CommonMessage) SendMessage(text, to string) {
c.method.send(text, to)
}
func NewCommonMessage(mi MessageImplementer) *CommonMessage {
return &CommonMessage{method: mi}
}
//紧急信息
type UrgencyMessage struct {
method MessageImplementer
}
func (u *UrgencyMessage) SendMessage(text, to string) {
u.method.send(fmt.Sprintf("【紧急信息】%v",text), to)
}
func NewUrgencyMessage(mi MessageImplementer) *UrgencyMessage {
return &UrgencyMessage{method: mi}
}
func main() {
var m AbstractMessage
//返回值为:*CommonMessage类型,而CommonMessage实现了AbstractMessage,因此需要定义的类型为;接口AbstractMessage
m=NewCommonMessage(ViaSMS())
m.SendMessage("你需要喝一杯咖啡吗","阿香")
m=NewCommonMessage(ViaEmail())
m.SendMessage("好滴","强哥")
m=NewUrgencyMessage(ViaSMS())
m.SendMessage("晚上桥头见","阿香")
m=NewUrgencyMessage(ViaEmail())
m.SendMessage("不见不散","强哥")
}
终端输出
桥接模式的代码拆分
1.项目的准备工作
找到 go 的 GOPATH
$ go env //可以查看 GOPATH
在 GOPATH 目录下创建3个文件夹
1.bin文件夹 -- 存放编译后的二进制文件
2.pkg文件夹 -- 存放编译后的库文件
3.src文件夹 -- 存放源码文件
2.创建文件夹
// -- 在项目文件夹 bridging_case 里创建新文件夹
// bridging -- 存放装饰者的全部文件
3.接口文件 -- bridging文件夹
文件1 -- messageimplementer.go
package bridging
//发送信息的具体实现(操作)
type MessageImplementer interface {
send(test, to string)
}
文件2 -- abstractmessage.go
package bridging
//发送信息的二次封装(发送普通信息、紧急信息)
type AbstractMessage interface {
SendMessage(text, to string)
}
4.结构体文件 -- bridging文件夹
文件1 -- messagesms.go
package bridging
import "fmt"
//发送SMS
type MessageSMS struct{}
func (*MessageSMS) send(test, to string) {
fmt.Printf("SMS信息:[%v];发送到:[%v]\n", test, to)
}
func ViaSMS() *MessageSMS { //创建
return &MessageSMS{}
}
文件2 -- messageemail.go
package bridging
import "fmt"
//发送email
type MessageEmail struct{}
func (*MessageEmail) send(test, to string) {
fmt.Printf("Email信息:[%v];发送到:[%v]\n", test, to)
}
func ViaEmail() *MessageEmail{//创建
return &MessageEmail{}
}
文件3 -- commonmessage.go
package bridging
//普通信息
type CommonMessage struct {
method MessageImplementer
}
func (c *CommonMessage) SendMessage(text, to string) {
c.method.send(text, to)
}
func NewCommonMessage(mi MessageImplementer) *CommonMessage {
return &CommonMessage{method: mi}
}
文件4 -- urgencymessage.go
package bridging
import "fmt"
//紧急信息
type UrgencyMessage struct {
method MessageImplementer
}
func (u *UrgencyMessage) SendMessage(text, to string) {
u.method.send(fmt.Sprintf("【紧急信息】%v",text), to)
}
func NewUrgencyMessage(mi MessageImplementer) *UrgencyMessage {
return &UrgencyMessage{method: mi}
}
5.主文件 -- main.go 在项目文件夹
package main
import (
"design/bridging_case/bridging"
)
func main() {
var m bridging.AbstractMessage
//返回值为:*CommonMessage类型,而CommonMessage实现了AbstractMessage,因此需要定义的类型为;接口AbstractMessage
m=bridging.NewCommonMessage(bridging.ViaSMS())
m.SendMessage("你需要喝一杯咖啡吗","阿香")
m=bridging.NewCommonMessage(bridging.ViaEmail())
m.SendMessage("好滴","强哥")
m=bridging.NewUrgencyMessage(bridging.ViaSMS())
m.SendMessage("晚上桥头见","阿香")
m=bridging.NewUrgencyMessage(bridging.ViaEmail())
m.SendMessage("不见不散","强哥")
}