【设计模式】6、bridge 桥接模式

server/2024/9/25 23:20:14/

六、bridge 桥接模式

桥接设计模式

  1. 复杂逻辑拆分:

如果需要完成复杂的逻辑,可以把复杂逻辑设计为接口,内部再拆分为若干接口。这样复杂的逻辑会被拆分开,方便解耦。

例如:如果遥控器控制设备。可以遥控器设计为复杂接口,设备设计为简单接口。遥控器的每个方法都由若干设备接口组成。设备可以有多种实现:如电视、手机等。

  1. 多维,避免组合爆炸:

如果有多个维度,各维度之间可以设计为接口,而不是让组合的数量爆炸。

例如:如果有 mac 和 windows 两种 os,需要分别连接 hp 和 epson 的打印机打印。为了避免实现 2x2 种组合类型(如 mac-hp、mac-epson、windows-hp、windows-epson 等),可以用接口。

6.1 多维:os 和 printer

Go 桥接模式讲解和代码示例

目录层级如下:

06bridge/061osprinter
├── epson_printer.go
├── hp_printer.go
├── mac_os.go
├── os.go
├── os_test.go
├── printer.go
├── readme.md
└── windows_os.go

6.1.1 os.go

package _61osprintertype os interface {Print()SetPrinter(p printer)
}

6.1.2 os_test.go

package _61osprinterimport ("fmt""testing"
)/*
=== RUN   TestOsPrint
mac系统
hp打印机mac系统
爱普生打印机windows系统
hp打印机windows系统
爱普生打印机--- PASS: TestOsPrint (0.00s)
PASS
*/
func TestOsPrint(t *testing.T) {hp := &hpPrinter{}epson := &epsonPrinter{}// macmac := &macOs{}mac.SetPrinter(hp)mac.Print()fmt.Println()mac.SetPrinter(epson)mac.Print()fmt.Println()// winwin := &windowsOs{}win.SetPrinter(hp)win.Print()fmt.Println()win.SetPrinter(epson)win.Print()fmt.Println()
}

6.1.3 os.go

package _61osprintertype os interface {Print()SetPrinter(p printer)
}

6.1.4 priner.go

package _61osprintertype printer interface {Print()
}

6.1.5 mac_os.go

package _61osprinterimport "fmt"type macOs struct {printer printer
}func (o *macOs) Print() {fmt.Println("mac系统")o.printer.Print()
}func (o *macOs) SetPrinter(p printer) {o.printer = p
}

6.1.6 windows_os.go

package _61osprinterimport "fmt"type windowsOs struct {printer printer
}func (o *windowsOs) Print() {fmt.Println("windows系统")o.printer.Print()
}func (o *windowsOs) SetPrinter(p printer) {o.printer = p
}

6.1.7 hp_printer.go

package _61osprinterimport "fmt"type hpPrinter struct {
}func (p *hpPrinter) Print() {fmt.Println("hp打印机")
}

6.1.8 epson_printer.go

package _61osprinterimport "fmt"type epsonPrinter struct{}func (p *epsonPrinter) Print() {fmt.Println("爱普生打印机")
}

http://www.ppmy.cn/server/5484.html

相关文章

【c++】vector的使用

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,我们本篇来到一个新的容器,vector的讲解和使用 目录 1.vector简单介绍2.vector的使用2.1构造函数2.2遍历vector2.3对容量操作2.4vector的增删查改 1.v…

Parade Series - CoreAudio Loopback

Scenario 鉴于业务场景需要, 经过技术路径探索, 发现 comtypes 兼容性过于混乱,故而考虑整合一个 CoreAudio 的轮子dll来解决实际问题!std::StringStream ⇒ std::ios::binary ⇒ std::ofstream Loopback.dll #ifndef _DLL_C…

OpenHarmony实战开发-如何使用弹簧曲线实现抖动动画及手机振动效果案例。

介绍 本示例介绍使用vibrator.startVibration方法实现手机振动效果,用keyframeAnimateTo关键帧动画实现点击后的抖动动画。 效果图预览 使用说明 1.加载完成后显示登录界面,未勾选协议时点击一键登录按钮会触发手机振动效果和提示文本的抖动动画。 实…

「51媒体」新闻媒体邀约如何进行媒体宣传(方法)

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 新闻媒体邀约进行媒体宣传是一个策略性的过程,旨在吸引媒体的注意力并促使其对特定事件、产品发布或企业活动进行报道。以下是一些关键步骤和策略: 制定媒体传播方…

某零售企业招聘管理体系搭建咨询项目

科学岗位分析,改善招聘流程,提高招聘及时率随着公司不断发展壮大,企业规模逐渐增大,部门设置也日益增多,因此对人员的需求也日益提高。但是目前该企业在人员招聘方面逐渐暴露出一些诸如岗位分析不到位、缺乏整体面试计…

[StartingPoint][Tier2]Base

Task 1 Which two TCP ports are open on the remote host? (远程服务器开放了哪两个TCP端口?) $ nmap -sC -sV 10.129.234.232 22,80 Task 2 What is the relative path on the webserver for the login page? (相关的登录页面路径是什么?) /login/login.php Task 3 …

[论文阅读链接]

CVPR2023:Learning Human-to-Robot Handovers from Point Clouds http://t.csdnimg.cn/OfSnShttp://t.csdnimg.cn/OfSnS仿真工具:dm_control: Software and Tasks for Continuous Control dm_control 翻译: Software and Tasks for Continuous Control…

vue 3 中i18n字符串 转义问题

文章目录 前言原因分析解决方案1. 特殊字符的转义2. 占位符与变量插值3. HTML标记4. 多行字符串 前言 本地没有问题,打包就有问题,最后排查是i18n问题,这里记录下 原因分析 特殊符号被误解析:某些特殊符号可能在字符串解析时被特…