当前位置: 首页 > article >正文

C++二十三种设计模式之桥接模式

C++二十三种设计模式之桥接模式

  • 一、组成
  • 二、特点
  • 三、目的
  • 四、缺点
  • 五、示例代码

一、组成

抽象类:声明功能接口,维护实现类的引用。
扩展抽象类:调用实现类功能接口,并实现自己的功能接口。
实现类:声明功能接口。
具体实现类:实现功能接口。

二、特点

1、抽象类包含实现类接口构成“桥”。
2、抽象类对实现类的引用以受保护的权限给子类继承。

三、目的

紧密相关的类拆分成抽象和实现两个独立的层次结构,通过组合的方式来代替继承。

四、缺点

1、性能问题,频繁的调用抽象类时,抽象类与实现类对象的引用关系有一定的性能损耗。
2、场景限制问题,适用于两个以上独立变化维度的情况。

五、示例代码

#include<iostream>
#include <vector>
#include <list>
#include <string>
#include <mutex>
#include <map>
#include<stack>

using namespace std;

class ImageOs;//实现类
class ImageOs_Windows;//具体实现类
class ImageOs_Linux; //具体实现类
class Image;//抽象类
class Image_PNG;//扩展抽象类
class Image_BMP; //扩展抽象类

//实现类
class ImageOs {
public:
	virtual void draw(const char* pData, int len) = 0;
	virtual ~ImageOs() {
		cout << "~ImageOs" << endl;
	};
};
//具体实现类
class ImageOs_Windows : public ImageOs {
public:
	void draw(const char* pData, int len) {
		cout << "A picture was drawn on the Windows system" << endl;
	};
	~ImageOs_Windows() {
		cout << "~ImageOs_Windows" << endl;
	};
};

class ImageOs_Linux : public ImageOs {
public:
	void draw(const char* pData, int len) {
		cout << "A picture was drawn on the Linux system" << endl;
	};
	~ImageOs_Linux() {
		cout << "~ImageOs_Linux" << endl;
	};
};

//抽象类
class Image {
public:
	Image(ImageOs* imageOs) : m_imageOs(imageOs) {};
	virtual void parseFile(const char* pFileName) = 0;
	virtual ~Image() {
		cout << "~Image" << endl;
	};
protected:
	ImageOs* m_imageOs;//抽象类包含实现类接口构成“桥”
};

//扩展抽象类
class Image_PNG : public Image {
public:
	Image_PNG(ImageOs* imageOs) : Image(imageOs) {}
	void parseFile(const char* pFileName) {
		char* pData = nullptr;
		int len = 0;
		cout << "Analyzed an image in PNG format" << endl;
		m_imageOs->draw(pData, len);
	};
	~Image_PNG() {
		cout << "~Image_PNG" << endl;
	}
};

class Image_BMP : public Image {
public:
	Image_BMP(ImageOs* imageOs) : Image(imageOs) {}
	void parseFile(const char* pFileName) {
		char* pData = nullptr;
		int len = 0;
		cout << "Analyzed an image in BMP format" << endl;
		m_imageOs->draw(pData, len);
	};
	~Image_BMP() {
		cout << "~Image_BMP" << endl;
	}
};

int main() {
	unique_ptr<ImageOs> imageOs_Windows = make_unique<ImageOs_Windows>();
	unique_ptr<ImageOs> imageOs_Linux = make_unique<ImageOs_Linux>();
	unique_ptr<Image_PNG> image_PNG = make_unique<Image_PNG>(imageOs_Windows.get());
	unique_ptr<Image_BMP> image_BMP = make_unique<Image_BMP>(imageOs_Linux.get());
	image_PNG->parseFile("1.png");
	image_BMP->parseFile("1.bmp");
}

http://www.kler.cn/a/470714.html

相关文章:

  • 数据治理如何激活企业沉睡数据价值?
  • 嵌入式中QT实现文本与线程控制方法
  • Excel中公式和函数的区别
  • C++list
  • Excel 做数据分析的好与不好
  • vue3 数字滚动效果
  • 一文读懂51单片机的中断系统
  • 【React】如何高效使用条件渲染
  • 使用C++对SQLite3数据库进行增、删、改、查操作实例
  • 2024 华为开发者大会介绍(附大会PPT下载)
  • PyTorch 自动混合精度AMP Grad Scaler 源码解析:_unscale_grads_ 与 unscale_ 函数
  • 【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
  • Excel 技巧02 - 如何批量输入百分号 (★),如何输入百分号并指定小数位数,如何批量删除百分号,如何批量删除小数最后的0?
  • iOS - Tagged Pointer
  • 使用vue项目中,使用webpack模板和直接用vue.config来配置相关插件 区别是什么,具体有哪些提现呢
  • Oracle数据库如何找到 Top Hard Parsing SQL 语句?
  • 基于Django运维系统实现AWS Route 53管理
  • SDAE的介绍
  • 路由器的转发表
  • 【Python】论文长截图、页面分割、水印去除、整合PDF
  • openwrt 清缓存命令行
  • OSPF - 影响OSPF邻居建立的因素
  • [python3]Excel解析库-openpyxl
  • Python----Matplotlib数据可视化
  • Springboot应急安全学习平台k4u90
  • 索引(MySQL)