桥接模式——C++实现

ops/2025/2/11 8:09:34/

目录

1 桥接模式定义

2 桥接模式小例子

3 桥接模式的总结


1 桥接模式定义

首先来看看桥接模式的官方定义吧:

桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种结构型模式。

桥接模式的定义确实比较难理解,比较抽象。

下面我们通过一个例子来体会一下桥接模式


2 桥接模式小例子

假设我们要在windows上编写一个读取硬盘上的图像并显示出来的图像类。因为图像的格式有很多种,它们的读取方式也都不一样。所以我们可以写一个Image父类,并根据不同的格式创建出不同的子类。代码大概就像下面这样:

class Image
{
public:virtual const char* read(string filename) = 0;virtual void display(const char* data) = 0;
};class JPEGImage : public Image
{
public:const char* read(string filename) { cout << "Reading JPEG image from file " << filename << endl; return nullptr; }void display(const char* data)override { cout << "Displaying JPEG image " << endl; }
};class PNGImage : public Image
{
public:const char* read(string filename) { cout << "Reading PNG image from file " << filename << endl; return nullptr; }void display(const char* data)override { cout << "Displaying PNG image " << endl; }
};int main()
{Image* jpg = new JPEGImage();const char* data = jpg->read("image.jpg");jpg->display(data);delete jpg;
}

 运行结果如下图所示:


假如现在我们想扩展我们的程序,想让它不仅能够在windows上面运行,并且能够在Linux上面也能运行。图像的格式在每个平台都是一样的,但是在两个平台下图像的显示方法是不一样的。

那么我们可能就会写出JPGImage_Win类、JPGImage_Linux类、PNGImage_Win类、PNGImage_Linux类等等。

如果在需要再增加对一个新平台的支持,就需要为每种图像增加一个针对该平台的类。如果需要再增加一种图像格式,就需要针对每一种平台编写一个类。

这样看起来相当麻烦,因为图像的格式和要显示的平台是两个不同的维度,它们都会产生变化。现在的设计把这两种的变化纠缠在了一起,无论哪一个维度产生了变化都会影响另一个维度。

幸运的是,我们有桥接模式


我们可以把图像的读取方法还放在Image的子类中实现,但是把平台显示的代码放到另一个类层次中去实现。并在Image类中引用一个平台类。

代码大概长下面这样子:

class Platform
{
public:virtual void display(const char* data) = 0;
};class WindowsPlatform : public Platform
{
public:void display(const char* data) { cout << "Displaying image on Windows platform" << endl; }
};class LinuxPlatform : public Platform
{
public:void display(const char* data) { cout << "Displaying image on Linux platform" << endl; }
};class Image
{
public:Image(Platform* p) : platform(p) {}virtual const char* read(string filename) = 0;void display(const char* data) { platform->display(data); }
private:Platform* platform;
};class JPEGImage : public Image
{
public:JPEGImage(Platform* p) : Image(p) {}const char* read(string filename) { cout << "Reading JPEG image from file " << filename << endl; return nullptr; }
};class PNGImage : public Image
{
public:PNGImage(Platform* p) : Image(p) {}const char* read(string filename) { cout << "Reading PNG image from file " << filename << endl; return nullptr; }
};int main()
{Platform* win = new WindowsPlatform();Image* jpg = new JPEGImage(win);const char* data = jpg->read("image.jpg");jpg->display(data);delete jpg;delete win;return 0;
}

这样就清爽多了,无论将来要扩展平台还是要扩展图片的格式,都可以轻松完成!

桥接模式真是太幸福啦!

3 桥接模式的总结

我觉得可以这样理解桥接模式:当类里面存在两个或多个独立变化的维度,并且每个维度都会进行扩展,这种情况下就可以使用桥接模式

桥接模式允许每个维度单独产生变化,而不影响其他维度。


http://www.ppmy.cn/ops/157479.html

相关文章

网络安全架构分层 网络安全组织架构

1.1.4 网络安全系统的基本组成 上节介绍到了&#xff0c;网络安全系统是一个相对完整的安全保障体系。那么这些安全保障措施具体包括哪些&#xff0c;又如何体现呢&#xff1f;这可以从OSI/RM的7层网络结构来一一分析。因为计算机的网络通信&#xff0c;都离不开OSIR/RM的这7层…

【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现

医院在为患者进行诊断和治疗过程中&#xff0c;会产生大量的医学影像图片&#xff0c;如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存&#xff0c;需要将每个患者文件夹下的图片合并成…

【系统架构设计师】嵌入式系统之JTAG接口

目录 1. 说明2. 主要功能2.1 硬件调试2.2 边界扫描测试2.3 系统内编程&#xff08;ISP&#xff09;2.4 配置和重新配置2.5 实时监控 3. 核心组件和引脚4. 应用场景5. 使用注意事项6. 例题6.1 例题1 1. 说明 1.嵌入式系统中的JTAG&#xff08;Joint Test Action Group&#xff…

PLSQL: 存储过程,用户自定义函数[oracle]

注意: raise notice是高斯的输出语句; DBMS_OUT_PUT.PUT_LINE是oracle的输出语句 存储过程 Stored Procedure 存储过程可以封装数据访问逻辑&#xff0c;使得应用程序可以通过调用存储过程来执行这些逻辑&#xff0c;而不是直接执行SQL语句。这有助于提高代码的可重用性、可…

深入浅出:机器学习的全面解析

深入浅出&#xff1a;机器学习的全面解析 引言 机器学习&#xff08;Machine Learning, ML&#xff09;作为人工智能的一个重要分支&#xff0c;近年来取得了显著进展&#xff0c;并在多个领域中得到了广泛应用。本文将从基础概念、核心算法、应用场景以及未来发展趋势等方面…

跨越边界,大模型如何助推科技与社会的完美结合?

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 概述 2024年&#xff0c;大模型技术已成为人工智能领域的焦点。这不仅仅是一项技术进步&#xff0c;更是一次可能深刻影响社会发展方方面面的变革。大模型的交叉能否推动技术与社会的真正融合&#xff1f;2025年…

【通俗解释,入门级】DeepSeek - R1 - Zero:强化学习提升LLM推理能力的奥秘

DeepSeek - R1 - Zero&#xff1a;强化学习提升LLM推理能力的奥秘 第一节&#xff1a;强化学习在DeepSeek - R1 - Zero中的基本概念与公式解释【通俗解释】 强化学习在DeepSeek - R1 - Zero里就像是一位“聪明的探险家”&#xff0c;在各种可能的推理路径中探索&#xff0c;通…

kafka专栏解读

kafka专栏文章的编写将根据kafka架构进行编写&#xff0c;即先编辑kafka生产者相关的内容&#xff0c;再编写kafka服务端的内容&#xff08;这部分是核心&#xff0c;内容较多&#xff0c;包含kafka分区管理、日志存储、延时操作、控制器、可靠性等&#xff09;&#xff0c;最后…