Bridge模式

设计模式:Bridge模式 如果你想要写一个游戏,并且想让这个游戏同时支持PC和手机,那么怎么样的设计可以避免写两套代码,并且不影响可扩展性呢?说起来还是比较简单的,只要把对平台的依赖部分抽取成抽象的接口(比如说绘图部分),并且针对抽取出来的接口,分别实现PC版和手机版就行了。系统的其他部分只要调用那套抽取出来的接口就可以完成所有的功能。这样来看,系统的其他部分是不依赖具体的平台的,也就具有了良好的扩展性。这个就是Bridge模式的应用。 阅读详情

Bridge模式可以更方便的扩展,实现了类的实现与定义的完全分离。实现方式为:通过定义两个类,一个类来定义功能,另一个类来实现功能,实现功能的类的对象以参数形式赋给定义功能的类,从而实现信息相互配合使用。

本想在此处插入Bridge模式的UML图示,插入太麻烦,过几天修改插入!

下面是Bridge模式的一个实现例子:

   /// 抽象类定义

// window.h: interface for the window class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WINDOW_H__879AA6CF_45FB_4EDD_BFF2_47275044D496__INCLUDED_)
#define AFX_WINDOW_H__879AA6CF_45FB_4EDD_BFF2_47275044D496__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class window  
{
public:
    
virtual void DrawRect(void) const = 0;
    
virtual void DrawText(void) const = 0;
    window();
    
virtual ~window();
}
;

#endif // !defined(AFX_WINDOW_H__879AA6CF_45FB_4EDD_BFF2_47275044D496__INCLUDED_)

/// 抽象类的类实现

// windowImp.h: interface for the windowImp class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WINDOWIMP_H__D9031704_B384_45AC_BA53_89CC82FE50FB__INCLUDED_)
#define AFX_WINDOWIMP_H__D9031704_B384_45AC_BA53_89CC82FE50FB__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

// 为window类的实现,由于window类是abstract class,所以,windowImp 也为
// abstract class
// window 和windowImp之间的关系为Bridge关系
class windowImp  
{
public:
    
virtual void DrawRectImp(void) const = 0;
    
virtual void DrawTextImp(void) const =0;
    windowImp();
    
virtual ~windowImp();

}
;

#endif // !defined(AFX_WINDOWIMP_H__D9031704_B384_45AC_BA53_89CC82FE50FB__INCLUDED_)

从设计耦合的角度讲,在window类的初始化时就把windwoImp类粘贴进去,那是更为不错的设计,但是,这么设计,将会导致派生类中运用windowImp成为一个较为麻烦的事情,那样设计可以通过两种方式来管理内部数据:
1、将基类中的windowImp实例作为protected类型
2、把windowImp实例作为private类型,在基类中定义一个虚拟函数,用来获取windowImp实例,这种方式更加灵活一些

此处为求简便,未在window类的构造函数中载入windowImp的实例

///派生抽象类的定义,成为具体的类定义IconWindow

// IconWindow.h: interface for the IconWindow class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_ICONWINDOW_H__721CA32A_45BD_49B3_A72B_83D5987D96A5__INCLUDED_)
#define AFX_ICONWINDOW_H__721CA32A_45BD_49B3_A72B_83D5987D96A5__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include 
"window.h"
#include 
"windowImp.h"

class IconWindow : public window  
{
public:
    
virtual void DrawRect(void) const;
    
virtual void DrawText(void) const;
    IconWindow(windowImp
& wndImp);
    
virtual ~IconWindow();

private:
    windowImp
& m_wndImp;
}
;

#endif // !defined(AFX_ICONWINDOW_H__721CA32A_45BD_49B3_A72B_83D5987D96A5__INCLUDED_)

在派生类的构造函数中载入了windowImp的实例(引用方式载入)

/// 下面是 IconWindow 的实现

// IconWindow.cpp: implementation of the IconWindow class.
//
//////////////////////////////////////////////////////////////////////

#include 
"IconWindow.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

IconWindow::IconWindow(windowImp
& wndImp)
: m_wndImp(wndImp)
{

}


IconWindow::
~IconWindow()
{

}


void IconWindow::DrawText() const
{
    m_wndImp.DrawTextImp();   //通过windowImp来实现其功能
}


void IconWindow::DrawRect() const
{
    m_wndImp.DrawRectImp();   //通过windowImp来实现其功能

}

/// 下面是XWindow系统下的windowImp实现,首先进行类定义

// XWindowImp.h: interface for the XWindowImp class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_XWINDOWIMP_H__5CC6D589_DDA4_4CBC_B2C0_60A79AB64962__INCLUDED_)
#define AFX_XWINDOWIMP_H__5CC6D589_DDA4_4CBC_B2C0_60A79AB64962__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include 
"windowImp.h"

class XWindowImp : public windowImp  
{
public:
    
virtual void DrawTextImp(void) const;
    
virtual void DrawRectImp(void) const;
    XWindowImp();
    
virtual ~XWindowImp();

}
;

#endif // !defined(AFX_XWINDOWIMP_H__5CC6D589_DDA4_4CBC_B2C0_60A79AB64962__INCLUDED_)

/// 然后是XWindowImp的实现

// XWindowImp.cpp: implementation of the XWindowImp class.
//
//////////////////////////////////////////////////////////////////////

#include 
"XWindowImp.h"
#include 
<iostream>
using namespace std;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

XWindowImp::XWindowImp()
{
    cout
<<"In XWindowImp class"<<endl;
}


XWindowImp::
~XWindowImp()
{
    cout
<<"quit XWindowImp class"<<endl;
}


void XWindowImp::DrawRectImp() const
{
    cout
<<"XWindowImp::DrawRectImp"<<endl;
}


void XWindowImp::DrawTextImp() const
{
    cout
<<"XWindowImp::DrawTextImp"<<endl;
}

为求简便,此处仅就实现这两个类的派生,下面进行测试:

#include "IconWindow.h"
#include 
"TranslentWindow.h"
#include 
"PMWindowImp.h"
#include 
"XWindowImp.h"
#include 
<iostream>
using namespace std;

void test(void)
{
    
// 测试XWindowImp中的性能,由于一般情况下,不同平台上不可能同时运行,
    
// 因此IconWindow以及TranslentWindow均需要重新定义
    XWindowImp xWndImp;
    IconWindow xIconWnd(xWndImp);
    xIconWnd.DrawText();
    xIconWnd.DrawRect();
//          在我的机器上,还有派生自window的TranslentWindow 的类定义与实现,也是通过调用
//          windowImp类引用的对象实现的。
//    TranslentWindow xTransWnd(xWndImp);
//    xTransWnd.DrawText();
//    xTransWnd.DrawRect();
    cout<<endl<<endl;

}


int main(void)
{
    test();
    
return 0;
}

 

小结:

       此处window类派生了IconWindow类,windowImp类派生了XWindowImp类。windowImp类是window类的实现,从两个派生类中接口函数的实现代码中可以看出,这也就是说window类是通过windowImp来实现,window类自己并没有实现接口功能的,而是通过windowImp类实现接口功能,这与单独一个类的申明与定义是类似的,因此window类可以作为类实现功能的申明,而windowImp类作为类实现功能的定义,这样就满足了接口与实现的完全分离,结合Decroator模式,window类的实现将会非常丰富,类与类之间的耦合程度也非常小,只有一个构造函数的耦合,同时也非常容易扩充,仅需要通过派生window类和windowImp类就可以实现新的window类功能与新的平台功能(此处)。

 

 

Docker网络虚拟化 -- Bridge模式 容器技术是最近几年最流行的技术之一,将程序所依赖的环境打包成一个镜像文件,并可以跨平台部署,真正做到了一次编译,处处运行,对研发和运维体系都产生了巨大的影响。 阅读详情

相关推荐

ROS2与Gazebo协同实现多机器人避障仿真

本文详细介绍了如何利用ROS2与Gazebo协同搭建多机器人避障仿真环境。通过创建SDF机器人模型、编写多机器人启动文件以及集成基础避障算法,构建了一个低成本、高效率的虚拟测试平台,为AGV编队、机器人集群等项目的算法验证与迭代提供了完整解决方案。

weixin_29065659的博客 296

“不给力啊,老湿!”:RSA加密与破解

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 加密和解密是自古就有技术了。经常看到侦探电影的桥段,勇敢又机智的主角,拿着一长串毫无意义的数字苦恼,忽然灵光一闪,翻出一本厚书,将第一个数字对应页码数,第二个数字对应行数,第三个数字对应那一行的某个词。数字变成了一串非常有意义的话: Eat the bean...

架构设计 507

计算机图形学入门30:动画与模拟介绍

计算机图形学入门,动画与模拟,物理模拟,质点弹簧系统,运动学,粒子系统,动作捕捉。

YanisWu的博客 1485

老湿,我可以自己选择办哪种手机卡么?

之前有报道说某些高校,新生入学必须办理电信或者移动的手机号,并且跟各种饭卡,银行卡啥的绑在一起,不然,就不给毕业。这是个神马社会,神马国度,神马学校,神马运营商啊,天理何在呀? 为啥不可以自己选择,为啥非要接受别人安排好的,这还有没有民主可言?开学也有几天了,估计又有不少童鞋被该死的手机卡搞得很头疼。就没有办法解决?3G时代了,还让我用那些该死的2G卡,上网一点也不流畅,我要...

yanghuidang 129

别再死磕DH参数了!用MATLAB Robotics Toolbox + SOLIDWORKS搞定六轴机械臂仿真(附避坑指南)

本文详细介绍了如何利用MATLAB Robotics Toolbox和SOLIDWORKS进行六轴机械臂仿真,避免常见的DH参数错误和模型导出问题。通过实战指南和避坑技巧,帮助工程师实现从三维建模到运动学仿真的无缝衔接,提升仿真效率和准确性。

weixin_27066963的博客 394

三分钟解决RKNN-Toolkit2安装失败:从模块报错到成功验证的完整记录

本文详细记录了RKNN-Toolkit2安装失败的解决方案,从环境配置到模型转换实战,特别针对常见的'No module named 'rknn''报错提供了完整修复指南。通过YOLOv8模型转换示例,展示了从ONNX到RKNN格式的完整流程,并分享了在RK3588芯片上的部署优化技巧。

html8的博客 264

bridge模式

1. 问题      总结面向对象实际上就两句话:一是松耦合(Coupling),二是高内聚(Cohesion)。面向对象系统追求的目标就是尽可能地提高系统模块内部的内聚(Cohesion)、尽可能降低模块间的耦合(Coupling)。然而这也是面向对象设计过程中最为难把握的部分,大家肯定在OO系统的开发过程中遇到这样的问题:1)客户给了你一个需求,于是使用一个类来实现(A);2)客户需求变化,有两个算法实现功能,于是改变设计,我们通过一个抽象的基类,再定义两个具体类实现两个不同的算法(A1和A2);3)客

笑对人生的专栏 2460

Cadence Virtuoso Layout 版图绘制

画好原理图,打好pin脚(pin最好以全大写的形式书写,以防后续操作中可能出现Bug) 查看所使用工艺库的design rule文件,确定栅格单位设置大小 在准备绘制的原理图界面启动layout XL/GXL 在layout界面按e,设置网格大小与design rule匹配 直接根据原理图生成版图 根据原理图连接关系显示版图中未连接的飞线 查看和更改原理图与版图中器件对应的链接关系 shift + f:显示器件版图细节 版图的构成:元器件(工艺厂商提供)、器件连接、阱连接、IO和PAD模拟电路

bobo_supper的博客 2万+

设计模式之Bridge模式

本文内容是通过学习《设计模式解析》 by - Alan Shalloway, James R. Trott 一书所总结的心得。博主想通过先提出问题,再解决问题的方式来让读者实际体验一把Bridge模式的优势。(这也是《设计模式解析》一书中采用的讲解流程,对于读者理解会有很大帮助)文中的案例也是使用的书中提供的案例。1.提出问题先看需求:有两个绘制实例D1和D2,它们都提供了drawLine和draw

javine的专栏 1273

一文读懂「Chain of Thought,CoT」思维链

Chain-of-Thought(CoT)是一种改进的Prompt技术,目的在于提升大模型LLMs在复杂推理任务上的表现,对于复杂问题尤其是复杂的数学题大模型很难直接给出正确答案。如算术推理(arithmetic reasoning)、常识推理(commonsense reasoning)、符号推理(symbolic reasoning)。COT通过要求模型在输出最终答案之前,显式输出中间逐步的推理步骤这一方法来增强大模型的算数、常识和推理能力。简单,但有效。2022 年,在 Google 发布的论文。

女王の专属领地 4万+

C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)

本文介绍如何在高速通信情况下解决串口接收的数据来不及处理的问题,由高级工程师多年经验总结而成,绝对是串口领域的实战经验!

qq_34059233的博客 6813

Docker中的bridge模式,可以这么设置

Docker容器和服务之所以强大的原因之一,是可以将它们连接在一起,或者将它们连接到非Docker的工作负载上。docker启动一个容器会根据docker网桥的网段,分配给容器一个ip地址,称为container-ip。docker网络作为整个docker体系中极为重要的一个知识点,在生产中经常被用到,尤其是网络模式当中的bridge模式和host模式更是应该重点掌握。docker网桥是每个容器的默认网关,同一台宿主机内的容器都会接入一个网桥,这样容器之间就能通过container-ip进行通信了。

威哥爱编程,华为 HDE,鸿蒙极客、优快云博客专家、《鸿蒙 HarmonyOS 5/6 开发之路》系列图书第一作者 2695

YOLOv11改进 | 引入SFSConv空间频率选择卷积(含SFSC3k2二次创新),空间频率特征协同作用,检测性能全面提升

本文提出在YOLOv11中引入SFSConv空间频率选择卷积模块,通过显式分离和动态融合空间域与频率域特征,解决传统卷积对多尺度目标检测的局限性。SFSConv包含空间频率分离、动态权重融合和协同特征重建三个核心机制,并进一步创新提出SFSC3k2结构,通过双路频率分支增强特征协同作用。该改进显著提升了YOLOv11在遥感、医学等多尺度复杂场景下的检测性能,实验显示在微小目标检测任务中mAP提升5%-10%。代码实现展示了SFSConv模块的核心逻辑及其在PyTorch中的高效实现。

走向CTO的路上... 768

Bridge (桥梁)模式

9.1 Bridge 模式   Bridge 的意思是 “桥梁”。就像在现实中,桥梁的功能是将河流的两侧连接起来一样,Bridge 模式的作用也是将两样东西连接起来,它们分别是 类的功能层次结构 和 类的实现层次结构。   Bridge 模式的作用是在 “类的功能层次结构” 和 “类的实现层次结构” 之间搭建桥梁。 || 类的层次结构的两个作用   ◆ 希望增加新功能时   假设现在有一个类 So...

矢落叶の博客 3597

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Bridge 模式

Bridge 模式 Bridge模式的作用是在“类的功能层次结构”和“类的实现层次机构”之间搭建桥梁。 类的功能层次结构 类的实现层次结构 类的层次结构的两个作用 1.希望增加新的功能时 其实就是主要是继承,我们在子类中增加新的方法。这样就构成了一个小小的类层次结构。 也就是为了增加新功能而产生的层次结构。 父类具有基本功能 在子类中增加新的功能 像这种层次结构就称为“类的功能层次结构”。...

stepMore的博客 384

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

usb to sata bridge_重温设计模式之 Bridge 模式

Bridge 模式定义意图将抽象部分与它的实现部分分离,使它们都可以独立地变化。动机让我们考虑在一个用户界面工具箱中,一个可移植的Window 抽象部分的实现。例如,这一抽象部分允许 Client 开发一些在 X Window System 和 IBM 的 PM(Presentation Manager)系统中都可以使用的 App。如果这里我们运用继承机制,比如定义 Window 抽象类和它的两个...

weixin_39603265的博客 811

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

GOF设计模式——Bridge模式

一、什么是Bridge模式?         讲述之前,先介绍两个关于类层次的重要概念:类的功能层次结构和类的实现层次结构。 1、类的功能层次结构         假如现在有一个父类ClassFarther,它具有一些基本功能,现在希望在业务上新增新的功能时,可以通过编写一个子类ClassSon去继承父类ClassFarther,并将新的功能写在子类里面,这样就构成了类层次结构:   ...

weixin_39400271的博客 310

23种设计模式之Bridge模式

23种设计模式之Bridge模式 简单的Bridge模式实现: https://github.com/ConfuseCat/DesignPattern/tree/master/src/SeparateConsideration/BridgeMode Bridge模式中的角色 Bridge的作用是在“类的功能层次结构”和“类的实现层次结构”之间搭建桥梁。 类的功能层次结构:希望添加新功能时:父类具有...

Confused_Tom_Cat的博客 406

【设计模式无难事】——Bridge模式

【设计模式无难事】——Bridge模式 一、意图 桥接模式,顾名思义,这里有一个“桥”。。。 为什么需要一个“桥”呢? 我们用它来连接什么呢? 下面先看一个例子 二、例子 需求场景 在游戏中,玩家使用武器砍怪时,战斗的特效的实现 武器:宝剑、铁锤 特效:吸魂、回旋飞 分析&实作 桥接模式实现 1,所有的特效都包括:激活,运用,消失。于是我们定义一个特效接口 Ench

zzy_801011的博客 325
上一篇: 项目管理培训记录
下一篇: 三种自定义消息数值范围
newrain021011
博客等级 码龄22年 17粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值