0
点赞
收藏
分享

微信扫一扫

13 桥接模式 -- go语言设计模式

桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(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.png

桥接模式的代码拆分

1.项目的准备工作

找到 go 的 GOPATH

$ go env		//可以查看 GOPATH

在 GOPATH 目录下创建3个文件夹

1.bin文件夹		-- 存放编译后的二进制文件

2.pkg文件夹		-- 存放编译后的库文件

3.src文件夹		-- 存放源码文件

2.创建文件夹

//	-- 在项目文件夹 bridging_case 里创建新文件夹

//	bridging	-- 存放装饰者的全部文件

2.png

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("不见不散","强哥")
}

终端输出

3.png

6.全部文件图

4.png

举报

相关推荐

0 条评论