[go] 桥接模式

桥接模式

是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。

模型说明

  • 抽象部分(Abstraction)提供高层控制逻辑,依赖于完成底层实际工作的实现对象。

  • 实现部分(Implementation)为所有具体实现声明通用接口。抽象部分仅能通过在这里声明的方法与实现对象交互。

  • 抽象部分可以列出和实现部分一样的方法,但是抽象部分通常声明一些复杂行为,这些行为依赖于多种由实现部分声明的原语操作。

  • 具体实现(Concrete Implementations)中包括特定于平台的代码。

  • 精确抽象(Refined Abstraction)提供控制逻辑的变体。与其父类一样,它们通过通用实现接口与不同的实现进行交互。

  • 通常情况下,客户端(Client)仅关心如何与抽象部分合作。但是,客户端需要将抽象对象与一个实现对象连接起来。

优缺点

1.优点

  • 你可以创建与平台无关的类和程序。
  • 客户端代码仅与高层抽象部分进行互动,不会接触到平台的详细信息。
  • *开闭原则:*你可以新增抽象部分和实现部分,且它们之间不会相互影响。
  • *单一职责原则:*抽象部分专注于处理高层逻辑, 实现部分处理平台细节。

2.缺点

  • 对高内聚的类使用该模式可能会让代码更加复杂。

使用场景

  • 如果你想要拆分或重组一个具有多重功能的庞杂类(例如能与多个数据库服务器进行交互的类),可以使用桥接模式。
  • 如果你希望在几个独立维度上扩展一个类,可使用该模式。
  • 如果你需要在运行时切换不同实现方法,可使用桥接模式。

参考代码

如果我们有一台Mac和一台Windows。还有两台打印机:爱普生和惠普。这两台电脑和打印机可能会任意组合使用。 客户端不应去担心如何将打印机连接至计算机的细节问题。
computer.go 抽象部分(高层控制)

package mainimport "fmt"type Computer interface {Print()SetPrinter(Printer)
}type Mac struct {printer Printer
}func (m *Mac) Print() {fmt.Println("Print request for mac")m.printer.PrintFile()
}func (m *Mac) SetPrinter(p Printer) {m.printer = p
}type Windows struct {printer Printer
}func (w *Windows) Print() {fmt.Println("Print request for windows")w.printer.PrintFile()
}func (w *Windows) SetPrinter(p Printer) {w.printer = p
}

priter.go 实现部分(底层实际工作)

package mainimport "fmt"type Printer interface {PrintFile()
}type Epson struct{}func (p *Epson) PrintFile() {fmt.Println("Printing by a EPSON Printer")
}type Hp struct{}func (p *Hp) PrintFile() {fmt.Println("Printing by a HP Printer")
}

main.go 客户端

package mainimport "fmt"func main() {hpPrinter := &Hp{}epsonPrinter := &Epson{}macComputer := &Mac{}macComputer.SetPrinter(hpPrinter)macComputer.Print()fmt.Println()macComputer.SetPrinter(epsonPrinter)macComputer.Print()fmt.Println()winComputer := &Windows{}winComputer.SetPrinter(hpPrinter)winComputer.Print()fmt.Println()winComputer.SetPrinter(epsonPrinter)winComputer.Print()fmt.Println()
}

output:

Print request for mac
Printing by a HP PrinterPrint request for mac
Printing by a EPSON PrinterPrint request for windows
Printing by a HP PrinterPrint request for windows
Printing by a EPSON Printer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/2789.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【自用】JavaSE--特殊文件Properties与XML、日志技术

特殊文件概述使用特殊文件可以存储多个有关系的数据,作为系统的配置信息属性文件类似于键值对,一一对应存储数据(比如用户名与密码)XML文件存储多个用户的多个属性更适合,适合存储更复杂的数据Properties注:这个属性文件的后缀即使…

【轨物方案】预防性运维:轨物科技用AI+机器人重塑光伏电站价值链

传统光伏电站的运维模式,常常被视为一个“成本中心”,其“故障-抢修”的逻辑模式,不仅响应滞后、效率低下,更难以从根本上提升资产的长期价值。然而,随着新能源行业的深刻发展,运维的价值被重新定义&#x…

【自动化运维神器Ansible】Ansible比较操作符详解:从基础到实战应用

目录 引言 1 Ansible比较操作符概述 1.1 什么是比较操作符&#xff1f; 1.2 比较操作符的分类与核心符号 2 核心比较操作符详解 2.1 相等与不等&#xff1a;与! 语法与基础用法 示例&#xff1a;字符串与数值比较 注意事项 2.2 大小比较&#xff1a;>、>、<…

配置 Docker 镜像加速,解决 docker pull 拉取镜像失败、docker search 查询镜像失败等问题

一、概述 记录时间 [2025-08-16] 在 Docker 学习中&#xff0c;可能会遇到诸如 docker 远程仓库无法访问、docker pull 拉取镜像失败、docker search 查询镜像失败等问题。 这是由于国内网络对 docker 远程仓库的访问受到限制。 那么在国内如何获取 docker 镜像呢&#xff1f…

智能工厂生产监控大屏-vue纯前端静态页面练习

学习前端还是非常有意思的&#xff0c;因为前端真的是可见即所得&#xff0c;可以做出来非常好看漂亮的页面&#xff0c;最近我就在使用前端技术 做一些大屏报表&#xff0c;在制作这些大屏报表过程中&#xff0c;又熟练的练习了自己的学到的相关的前端技术&#xff0c;接下来把…

Android 欧盟网络安全EN18031 要求对应的基本表格填写

Android 欧盟网络安全EN18031 要求对应的基本表格填写 文章目录Android 欧盟网络安全EN18031 要求对应的基本表格填写一、背景二、18031认证预填表格三、其他1、Android EN 18031 要求对应的基本表格小结2、EN 18031的要求表格内容填写3、一定要做三方认证&#xff1f;4、欧盟网…

Java Lambda表达式是什么,怎么用

这种代码是什么&#xff0c;怎么阅读/*** 批量插入** param entityList ignore* param batchSize ignore* return ignore*/Transactional(rollbackFor Exception.class)Overridepublic boolean saveBatch(Collection<T> entityList, int batchSize) {String sqlStateme…

力扣习题:基本计算器

本片内容我们将针对于一个力扣中的一道很经典的习题&#xff1a;基本计算器。 这道题目十分经典&#xff0c;在很多大厂的面试题中都有出现过 因此我们将进一步来学习 该题目代码已经上传作者的个人gitee&#xff1a;CPP 学习代码库: C代码库新库&#xff0c;旧有C仓库满员了喜…

​​金仓数据库KingbaseES V9R1C10安装教程 - Windows版详细指南​

文章目录一、前言二、软件下载2.1 下载安装包2.2 下载授权文件三. 安装KingbaseES数据库3.1 解压安装包3.2 运行安装程序3.3 安装步骤详解步骤1&#xff1a;欢迎界面步骤2&#xff1a;许可协议步骤3&#xff1a;添加授权文件步骤4&#xff1a;选择安装路径步骤5&#xff1a;选择…

基于HTML5与Tailwind CSS的现代运势抽签系统技术解析

引言 浪浪山札记&#xff1a;献给所有在暗夜里倔强发光的普通人 一、系统概述 "每日运签"是一个基于现代Web技术构建的交互式运势抽取应用&#xff0c;结合了中国传统文化元素与现代UI设计理念。该系统采用HTML5、CSS3和JavaScript作为核心技术栈&#xff0c;并利用T…

面试题:如何用Flink实时计算QPS

Flink 实时计算 QPS 面试题题目&#xff1a; 假设某互联网应用日活用户 100 万&#xff0c;每天产生 1 亿条数据&#xff08;日志/事件&#xff09;&#xff0c;要求使用 Apache Flink 实现实时计算系统的 QPS&#xff08;Queries Per Second&#xff09;&#xff0c;并考虑以下…

快速部署一个鉴黄服务

1.安装依赖pip install opennsfw22.代码实现import opennsfw2 as n2# 将自动下载预训练模型 open_nsfw_weights.h5 到 C:\Users\Administrator\.opennsfw2\weights # pip install opennsfw2# 单张预测 image_path 1.jpg nsfw_probability n2.predict_image(image_path) print…