桥接模式(C++)

定义

将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。

使用场景

  • 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。
  • 如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?

结构

在这里插入图片描述

代码示例

//Bridge.h
/****************************************************/
#ifndef BRIDGE_H
#define BRIDGE_H
#include<iostream>
using namespace std;//创建桥接实现接口drawapi。
class drawapi
{
public:drawapi() {};virtual ~drawapi() {};virtual void drawcircle(int radius,int x,int y)=0;};//创建实现了DrawAPI接口的实体桥接实现类redcircle。
class redcircle:drawapi
{
public:redcircle() {};virtual ~redcircle() {};void drawcircle(int radius, int x, int y) { cout << "color: red " << "sadius: " << radius << " x: " << x << " y: " << y << endl; };
};//创建实现了DrawAPI接口的实体桥接实现类greencircle。
class greencircle :drawapi
{
public:greencircle() {};virtual ~greencircle() {};void drawcircle(int radius, int x, int y) { cout << "color: green " << "sadius: " << radius << " x: " << x << " y: " << y << endl; };
};//使用DrawAPI接口创建抽象类Shape。
class shape
{
public:shape() {};virtual ~shape() { delete mdrawapi; mdrawapi = NULL; };virtual void draw()=0;protected:drawapi *mdrawapi;
};//创建实现了Shape接口的实体类circle。
class circle :shape
{
public:circle(int tx, int ty, int tradius, drawapi *tdrawapi) { mdrawapi = tdrawapi; x = tx; y = ty; radius = tradius; };~circle() {};void draw() { mdrawapi->drawcircle(radius,x,y); };
private:int x;int y;int radius;
};#endif
//test.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Bridge.h"
int main()
{shape *t1 = (shape*)new circle(100, 100, 10, (drawapi*)new redcircle());shape *t2 = (shape*)new circle(35, 74, 10, (drawapi*)new greencircle());t1->draw();t2->draw();delete t1;t1 = NULL;delete t2;t2 = NULL;return 0;
}

运行结果
在这里插入图片描述

要点总结

  • Bridge模式使用“对象间的组合关系"解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自纬度的变化,即"子类化”它们。
  • Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因), 复用性比较差。Bridge模式是比多继承方案更好的解决方法。
  • Bridge模式的应用一般在"两个非常强的变化维度",有时一一个类也有多于两个的变化维度,这时可以使用Bridge的扩展模式。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu服务器版配置wifi

最近把曾经不用的上网本安装了一个Ubuntu-Server版&#xff0c;当成服务器来用&#xff0c;因为家庭网络布线问题&#xff0c;只好用自带的WIFI来连接网络&#xff0c;Server版也没有什么图形化的管理工具&#xff0c;之后手动编辑配置文件了。 Server下面配置起来还是很方便的…

四、FreeRTOS创建任务和源码结构

说明&#xff1a;该内容示例在如下博客的基础上进行。 三、从官方源码精简出第1个FreeRTOS_朱嘉鼎的博客-CSDN博客 1、创建任务 (1)程序 /*任务1的函数*/ void Task1Function( void * param) {while(1){printf("task1\r\n");} }/*任务2的函数*/ void Task2Functi…

Elasticsearch 商业启示

上月的“红帽事件”&#xff0c;说明开源软件的“客服模式”行不通&#xff0c;那么&#xff0c;开源软件如何赚钱呢&#xff1f;既不能卖软件&#xff0c;又不能卖支持服务&#xff0c;该怎么办呢&#xff1f;我现在的看法是&#xff0c;只剩下一种模式是可行的&#xff0c;开…

博客项目测试报告

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 一、项目背景二、项目功能三、测试计划一&#xff09;功能测试二&#xff09;自动化测试三&#xff09;性能测试编写性能测试…

Vue3 第一节 Vue3简介以及创建Vue3工程

1.Vue3简介以及Vue3带来了什么 2.创建Vue3.0工程并分析Vue3工程结构 3.setup函数 4.ref函数 5.reactive函数 一.Vue3简介以及Vue3带来了什么 ① Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff0…

auto-changelog的简单使用

auto-changelog的简单使用 自动化生成Git提交记录&#xff0c;CHANGELOG.md文件 github&#xff1a;https://github.com/cookpete/auto-changelog 安装 npm install -g auto-changelog配置脚本 package.json文件下 "scripts": {"changelog": "aut…

IntelliJ IDEA 如何优雅的添加文档注释(附详细图解)

IntelliJ IDEA 如何优雅的添加文档注释&#xff08;附详细图解&#xff09; &#x1f4cc;提要✍✍类注释✍✍方法注释 &#x1f4cc;提要 在开发过程中&#xff0c;最常用的注释有两种&#xff1a;类注释和方法注释&#xff0c;分别是为类和方法添加作者、日期、版本号、描述等…

小程序的 weiui的使用以及引入

https://wechat-miniprogram.github.io/weui/docs/quickstart.html 网址 1.点进去&#xff0c;在app.json里面配置 在你需要的 页面的 json里面配置&#xff0c;按需引入 然后看文档&#xff0c;再在你的 wxml里面使用就好了

2023年8月初补题

看这个人的专栏 https://blog.csdn.net/qq_42555009/category_8770183.html 有一定思维难度&#xff0c;贪心&#xff0c;用multiset实现 翻译&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/33187/H 来源&#xff1a;牛客网 在夜之城的中心有一座高大…

JavaScript Es6 _1 笔记

JavaScript Es6 _1 笔记 学习作用域、变量提升、闭包等语言特征&#xff0c;加深对 JavaScript 的理解&#xff0c;掌握变量赋值、函数声明的简洁语法&#xff0c;降低代码的冗余度。 理解作用域对程序执行的影响能够分析程序执行的作用域范围理解闭包本质&#xff0c;利用闭包…

协议,序列化,反序列化,Json

文章目录 协议序列化和反序列化网络计算器protocol.hppServer.hppServer.ccClient.hppClient.cclog.txt通过结果再次理解通信过程 Json效果 协议 协议究竟是什么呢&#xff1f;首先得知道主机之间的网络通信交互的是什么数据&#xff0c;像平时使用聊天APP聊天可以清楚&#x…

选择排序(指针法)

描述 用选择法对10个整数排序。 输入 输入包含10个整数&#xff0c;用空格分隔。 输出 输出排序后的结果&#xff0c;用空格分隔。 输入样例 1 3 1 4 1 5 9 2 6 5 3 输出样例 1 1 1 2 3 3 4 5 5 6 9 输入样例 2 2 4 6 8 10 12 14 16 18 20 输出样例 2 2 4 6 8 1…

迭代器模式(Iterator)

迭代器模式是一种行为设计模式&#xff0c;可以在不暴露底层实现(列表、栈或树等)的情况下&#xff0c;遍历一个聚合对象中所有的元素。 Iterator is a behavior design pattern that can traverse all elements of an aggregate object without exposing the internal imple…

【二分查找】74. 搜索二维矩阵

74. 搜索二维矩阵 解题思路 方法1 将二维数组转换为一维数组使用二分查找 class Solution {public boolean searchMatrix(int[][] matrix, int target) {// 使用二分查找// 将矩阵写入一个数组中 然后使用二分查找算法int[] a new int[matrix.length * matrix[0].length];i…

机器学习常用Python库安装

机器学习常用Python库安装 作者日期版本说明Dog Tao2022.06.16V1.0开始建立文档 文章目录 机器学习常用Python库安装Anaconda简介使用镜像源配置 Pip简介镜像源配置 CUDAPytorch安装旧版本 TensorFlowGPU支持说明 DGL简介安装DGLLife RDKitscikit-multilearn Anaconda 简介 …

Python 程序设计入门(004)—— 赋值运算符与常用函数

Python 程序设计入门&#xff08;004&#xff09;—— 赋值运算符与常用函数 目录 Python 程序设计入门&#xff08;004&#xff09;—— 赋值运算符与常用函数一、赋值运算符二、常用的数学函数1、round() 函数2、pow() 函数3、divmod() 函数 三、字符串与 str() 函数1、字符串…

UEditorPlus v3.3.0 图片上传压缩重构,UI优化,升级基础组件

UEditor是由百度开发的所见即所得的开源富文本编辑器&#xff0c;基于MIT开源协议&#xff0c;该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器&#xff0c;主要做了样式的定制&#xff0c;更符…

C++经典排序算法详解

目录 一、选择排序 二、冒泡排序 三、插入排序 一、选择排序 选择排序 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法。它的工作原理是&#xff1a;第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存…

解决vite+vue3项目npm装包失败

报错如下&#xff1a; Failed to remove some directories [ npm WARN cleanup [ npm WARN cleanup D:\\V3Work\\v3project\\node_modules\\vue, npm WARN cleanup [Error: EPERM: operation not permitted, rmdir D:\V3Work\v3project\node_modules\vue\reactivity\…

题解 | #B.Distance# 2023牛客暑期多校6

B.Distance 贪心(?) 题目大意 对于两个大小相同的多重集 A , B \mathbb{A},\mathbb{B} A,B &#xff0c;可以选择其中任一元素 x x x 执行操作 x x 1 xx1 xx1 任意次数&#xff0c;最少的使得 A , B \mathbb{A},\mathbb{B} A,B 相同的操作次数记为 C ( A , B ) C(\m…