桥接模式(Bridge Pattern)

server/2024/12/27 20:07:17/

桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分实现部分分离,使它们可以独立变化。它的核心思想是通过引入一个“桥”类,将抽象层与实现层解耦。


桥接模式的结构

  • Abstraction(抽象部分)
    定义高层的抽象接口,提供公共的方法声明。

  • Implementor(实现接口部分)
    定义实现部分的接口,一般是抽象类或接口。

  • ConcreteImplementor(具体实现部分)
    实现具体的逻辑,继承自 Implementor

  • RefinedAbstraction(扩展抽象部分)
    扩展或细化抽象部分的逻辑。

桥接模式的核心是通过 "组合" 而非 "继承" 将抽象部分与实现部分关联。


桥接模式的代码示例

示例场景:不同平台上的视频播放器

我们创建一个桥接模式,处理跨平台的多种视频播放器:

  1. 抽象出一个播放器的抽象类 VideoPlayer
  2. 提供具体的实现部分接口 Platform
  3. 通过桥接的方式组合它们。

示例代码
 

cpp

#include <iostream>
#include <memory>
#include <string>using namespace std;// Implementor:定义实现接口
class Platform {
public:virtual ~Platform() = default;virtual void playVideo(const string& video) = 0;
};// ConcreteImplementorA:Windows 实现
class WindowsPlatform : public Platform {
public:void playVideo(const string& video) override {cout << "Playing video on Windows: " << video << endl;}
};// ConcreteImplementorB:Linux 实现
class LinuxPlatform : public Platform {
public:void playVideo(const string& video) override {cout << "Playing video on Linux: " << video << endl;}
};// Abstraction:播放器抽象接口
class VideoPlayer {
protected:shared_ptr<Platform> platform; // 桥接到具体实现的接口public:explicit VideoPlayer(shared_ptr<Platform> p) : platform(std::move(p)) {}virtual ~VideoPlayer() = default;virtual void play(const string& video) = 0;
};// RefinedAbstraction:高级播放器
class AdvancedPlayer : public VideoPlayer {
public:explicit AdvancedPlayer(shared_ptr<Platform> p) : VideoPlayer(std::move(p)) {}void play(const string& video) override {cout << "AdvancedPlayer: Preparing video..." << endl;platform->playVideo(video); // 调用桥接的具体实现cout << "AdvancedPlayer: Finished playing video." << endl;}
};// RefinedAbstraction:普通播放器
class SimplePlayer : public VideoPlayer {
public:explicit SimplePlayer(shared_ptr<Platform> p) : VideoPlayer(std::move(p)) {}void play(const string& video) override {cout << "SimplePlayer: ";platform->playVideo(video); // 调用桥接的具体实现}
};// 客户端代码
int main() {// 创建具体实现:Windows 平台shared_ptr<Platform> windows = make_shared<WindowsPlatform>();// 创建具体实现:Linux 平台shared_ptr<Platform> linux = make_shared<LinuxPlatform>();// 使用不同实现创建播放器VideoPlayer* player1 = new AdvancedPlayer(windows);VideoPlayer* player2 = new SimplePlayer(linux);// 播放视频player1->play("movie.mp4");player2->play("song.mp4");// 释放资源delete player1;delete player2;return 0;
}

输出结果
 
AdvancedPlayer: Preparing video...
Playing video on Windows: movie.mp4
AdvancedPlayer: Finished playing video.
SimplePlayer: Playing video on Linux: song.mp4

桥接模式的分析

  1. 角色分离

    • 抽象层VideoPlayer 提供一个统一的高层接口。
    • 实现层Platform 定义跨平台的实现接口。
  2. 灵活性

    • 平台层(Windows/Linux)和播放器层(Simple/Advanced)可以独立扩展,相互解耦。
  3. 桥接点

    • VideoPlayerPlatform 通过组合关联而不是继承。

桥接模式与 Android 图形栈的关系

在 Android 图形栈中,类似的桥接模式如下:

  • 抽象层:高层使用的 IGraphicBufferProducer
  • 实现层:具体硬件或系统服务提供的 HAL 实现。
  • 桥接点:B2HGraphicBufferProducer 将两个层次桥接,帮助实现抽象和具体逻辑的解耦。

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

相关文章

Golang中的Map是怎么遍历的

在 Golang 中&#xff0c;遍历 map 的常见方法是使用 for...range 循环。map 是无序的键值对集合&#xff0c;因此遍历 map 时&#xff0c;每次迭代访问的键值对顺序可能不同。 以下是一个遍历 map 的示例&#xff1a; package mainimport "fmt"func main() {// 创…

【Linux】如何对比两个文件数据不同的地方

简介 可以使用vimdiff命令和diff diff使用 #使用diff命令对比数据 #diff 是最常用的文件对比工具&#xff0c;能够显示两个文件之间的不同之处。基本用法&#xff1a; diff file1.txt file2.txt #diff 会逐行对比文件&#xff0c;并显示它们之间的差异。 #输出中&#xff0c…

论文阅读 - 《Large Language Models Are Zero-Shot Time Series Forecasters》

Abstract 通过将时间序列编码为数字组成的字符串&#xff0c;我们可以将时间序列预测当做文本中下一个 token预测的框架。通过开发这种方法&#xff0c;我们发现像GPT-3和LLaMA-2这样的大语言模型在下游任务上可以有零样本时间序列外推能力上持平或者超过专门设计的时间序列训…

plantuml的picoweb无法渲染分页图表的问题

1. 背景 使用plantuml自带的picoweb在渲染分页图表时&#xff0c;vscode无法换页&#xff0c;但是使用plantuml官网渲染则没问题。查看plantuml官网的picoweb的说明&#xff0c;picoweb只是plantuml服务的最小实现。因此考虑可能是plantuml服务不全导致的上述问题。 2. docke…

探究人工智能在教育领域的应用——以大语言模型为例

摘要&#xff1a;随着人工智能技术的不断发展&#xff0c;大语言模型&#xff08;LLMs&#xff09;已经成为各行各业的重要工具。本文旨在探讨大语言模型在教育领域的应用现状、挑战和前景&#xff0c;提出一套切实可行的解决方案&#xff0c;以期为教育行业带来革新。通过对大…

连接串口设备后鼠标出现乱跳

在Windows 10系统中&#xff0c;连接串口设备后鼠标出现乱跳的现象&#xff0c;可能是由于串口设备被误识别为串行鼠标。以下是一些解决方法&#xff1a; 禁用串行鼠标检测&#xff1a; 打开设备管理器&#xff08;可以通过右键点击“此电脑”选择“管理”&#xff0c;然后选择…

在C#中制作一个字符串扩展来确定字符串是否与正则表达式匹配

正则表达式可以让你&#xff08;相对&#xff09;轻松地确定字符串是否与某种模式匹配。此示例展示了如何在 C# 中创建字符串扩展方法来确定字符串是否与正则表达式匹配 下面的StringExtensions类定义了Matches字符串扩展方法。 public static class StringExtensions {// Ext…

家政预约小程序数据库设计

目录 1 如何设计表结构1.1 用户表1.2 服务分类表1.3 服务表1.4 服务规格表1.5 订单表1.6 服务人员表1.7 评价表1.8 促销活动表1.9 投诉表1.10 年卡表1.11 派单表1.12 支付记录表1.13 通知记录表1.14 优惠券表1.15 用户优惠券表1.16 消息模板表1.17 积分记录表 经过一系列的设计…