首页 > 其他分享 >13 桥接模式 -- go语言设计模式

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

时间:2023-08-14 21:01:37浏览次数:44  
标签:13 string 桥接 bridging CommonMessage -- SendMessage func 设计模式

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

标签:13,string,桥接,bridging,CommonMessage,--,SendMessage,func,设计模式
From: https://blog.51cto.com/u_14483476/7081532

相关文章

  • EdgeBERT:极限压缩,比ALBERT再轻13倍!树莓派上跑BERT的日子要来了?
    文|Sheryc_王苏这个世界上有两种极具难度的工程:第一种是把很平常的东西做到最大,例如把语言模型扩大成能够写诗写文写代码的GPT-3;而另一种恰恰相反,是把很平常的东西做到最小。对于NLPer来说,这种“小工程”最迫在眉睫的施展对象非BERT莫属。从18年那个109M参数的BERT,到52M......
  • Java中常用的设计模式
    Java中常用的设计模式有以下几种:单例模式(SingletonPattern):确保一个类只有一个实例,并提供全局访问点。工厂模式(FactoryPattern):通过工厂类创建对象,隐藏对象的实例化过程。抽象工厂模式(AbstractFactoryPattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体类。建造者......
  • 8.13总结
    今天早早收拾好行李,去爬泰山了,听说泰山会制服每一个嘴硬的人,跟着其他三个朋友前去。到了地方,找好民宿后我i们坐在一起聊聊天没很享受这种氛围,晚上一起去外面吃了个饭,吃饱后我们步行回民宿去,准备去泰山了,大约十点半多年开始爬,希望能成功登顶......
  • LeetCode 213.打家劫舍II
    1.题目:你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存......
  • 删数问题 洛谷p1323
    决定做一系列贪心,贪心真的,最早学的算法,到现在还有时候不太敢贪,还贪不来,一直挺逃避贪心问题的。。 删除前的数字可以先用优先队列对所有数字进行预处理,数据范围是3e4,也不是很大,直接全部处理了吧。constintN=1e5+10,inf=0x3f3f3f3f3f3f3f3f,MAX=3e4+10;inta[N]......
  • 简单工厂设计模式
    一.意图简单工厂模式(SimpleFactory) 又叫静态工厂方法(StaticFactoryMethod)模式。简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例。 二.特点根据外部传入的类型确定要创建哪一个具体类的对象,通过简单工厂模式,客户端无需关注对象如何创建......
  • 模板设计模式
    一.意图模板方法模式 (TemplateMethod)是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术。,没有关联关系。因此,在模板方法模式的类结构......
  • VTK 实例8:command与observe设计模式(当交互使相机变化时打印出当前相机的坐标,当发生拾
    1#include"vtkAutoInit.h"2VTK_MODULE_INIT(vtkRenderingOpenGL2);3VTK_MODULE_INIT(vtkInteractionStyle);4#include<vtkConeSource.h>5#include<vtkPolyDataMapper.h>6#include<vtkRenderer.h>7#include<vtkRende......
  • VM虚拟机三种网络配置详解(桥接、NAT、仅主机)
    VM虚拟机三种网络配置详解(桥接、NAT、仅主机)链接在学习网络配置之前,需要搞明白有关于网络的一些基本概念,什么是ip,子网掩码,网段,网关?这里只做最简单的解释,实际上远远不止这些。网络名词ip在现实生活中,这么大的一个中国,物流怎么能清楚的找到需要配送的终点,靠的就是地址。在互......
  • 1378. 使用唯一标识码替换员工ID
    1378.使用唯一标识码替换员工ID2023年8月14日10:50:221378.使用唯一标识码替换员工ID简单39相关企业SQLSchemaPandasSchemaEmployees表:+---------------+---------+|ColumnName|Type|+---------------+---------+|id|int||name......