设计模式——桥接模式(Brigde Pattern)

本文介绍了桥接模式的概念、构成及应用场景,并通过一个饮料价格的例子详细解释了如何利用该模式实现抽象部分与实现部分的分离,从而提高代码的可扩展性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

桥接模式:

桥接模式是指将抽象部分和它的实际部分分离,使它们可以独立地变化。

桥接模式的构成:


桥接模式的各部分:

1、Abstraction接口:定义抽象部分的接口,维持Implementor对象的一个参考。

2、RedfinedAbstraction类:实现Abstraction的实类。

3、Implementor接口:定义implemention类的接口,规定一些常用的方法。

4、ConcreteImplementor类:实现了Implementor接口的类。


桥接模式的举例:

在购买杯饮时,会选择饮料的类型和容量,不同的类型和容量价格也相应不同,下面是运用桥接模式模拟这几种不同的组合得到的价格。


代码如下:

public interface TeaKind {
	public float price();
}

public class GreenTea implements TeaKind {
	public float price() {
		return 2.0f; //绿茶的价格  为了方便就没有定义成静态常量
	}
}

public class RedTea implements TeaKind {
	
	public float price() {
		return 3.0f; //红茶的价格  为了方便就没有定义成静态常量
	}
}


public interface TeaSize {
	public float getPrice();
}


public class MedTea implements TeaSize {
	public TeaKind teaKind;
	
	public MedTea(TeaKind teaKind) {
		this.teaKind = teaKind;
	}

	public float getPrice() {
		return 1.5f*teaKind.price();
	}
}

public class SupTea implements TeaSize {
	public TeaKind teaKind;
	
	public SupTea(TeaKind teaKind) {
		this.teaKind = teaKind;
	}

	public float getPrice() {
		return 2.5f*teaKind.price();
	}
}
运行结果:



桥接模式的应用场景:

1、当要避免抽象部分和实现部分的永久绑定,例如实现部分必须在运行时被选择的时候,使用桥接模式。


桥接模式的优缺点:

优点:

1、分离接口和实现部分。

2、提高了可扩展性。可以独立的经行扩充。

3、实现细节对客户的透明。即对客户隐藏实现细节。

缺点:

当有两个后两个以上唯度变化时,同时要增加聚合对象的内部方法,因为它不得不多写方法以便包含它的类调用。


### ROS cv_bridge 使用教程及常见问题解决 #### 安装 `cv_bridge` 的方法 可以通过包管理器直接安装适用于当前 ROS 版本的 `cv_bridge` 库。具体命令如下所示[^1]: ```bash sudo apt-get install ros-<ros-release>-cv-bridge ``` 其中 `<ros-release>` 需要替换为实际使用的 ROS 发行版名称,例如 `noetic` 或 `melodic`。 --- #### `cv_bridge` 功能概述 `cv_bridge` 是一个连接 ROS 和 OpenCV 的桥梁工具,主要用于实现传感器消息(`sensor_msgs/Image` 类型)与 OpenCV 图像数据之间的转换。其核心功能包括但不限于以下几点[^2]: - 将 ROS 中的消息类型 `sensor_msgs::Image` 转换为 OpenCV 的图像格式 `cv::Mat`。 - 反向操作:将 OpenCV 的图像格式 `cv::Mat` 转换回 ROS 消息类型 `sensor_msgs::Image`。 以下是基本的代码示例展示如何完成上述两种类型的转换: --- #### 示例代码:使用 `cv_bridge` 进行图像转换 ##### 1. ROS 到 OpenCV (`sensor_msgs::Image -> cv::Mat`) 下面展示了从 ROS 订阅到的图像消息中提取并处理成 OpenCV 格式的流程: ```cpp #include <cv_bridge/cv_bridge.h> #include <image_transport/image_transport.h> #include <opencv2/highgui/highgui.hpp> void imageCallback(const sensor_msgs::ImageConstPtr& msg) { try { // Convert the ROS Image message to an OpenCV Mat object. cv::Mat img = cv_bridge::toCvShare(msg, "bgr8")->image; // Display or process the image using OpenCV functions here... cv::imshow("View", img); cv::waitKey(30); // Wait for a short time before processing next frame. } catch (cv_bridge::Exception& e) { ROS_ERROR("Could not convert from '%s' to 'bgr8'.: %s", msg->encoding.c_str(), e.what()); } } ``` ##### 2. OpenCV 到 ROS (`cv::Mat -> sensor_msgs::Image`) 如果需要发布由 OpenCV 处理后的图像,则可以按照以下方式将其重新封装为 ROS 消息类型: ```cpp cv::Mat input_image; // Assume that you have already loaded your image into this variable... try { // Create and populate a new ROS Image message with data from the OpenCV matrix. sensor_msgs::ImagePtr output_msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", input_image).toImageMsg(); // Publish the resulting ROS message via some publisher instance named pub_. pub_.publish(output_msg); } catch(cv_bridge::Exception &e){ ROS_ERROR("Failed to publish converted image due to exception: %s", e.what()); } ``` --- #### 常见问题及其解决方案 1. **错误提示:“No module named ‘cv_bridge’”** 如果在 Python 环境下运行时遇到此错误,可能是因为未正确安装或配置依赖项。尝试通过以下命令重新安装必要的软件包: ```bash sudo apt-get update && sudo apt-get install python3-cv-bridge ``` 2. **编码不匹配导致无法正常显示图片** 当调用 `cv_bridge::toCvShare()` 函数时报错 “Unsupported conversion format”,通常意味着输入图像的编码格式不符合预期目标格式的要求。此时应检查原始图像的实际编码属性,并调整参数设置以适配之。 3. **性能优化建议** 对于高帧率视频流场景下的实时应用开发而言,合理利用多线程机制以及减少不必要的内存拷贝操作能够显著提升效率。例如,在订阅端仅保留最近一帧的数据副本即可满足大多数需求而无需缓存过多历史记录. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值