bridge桥接模式_Bridge模式

bridge桥接模式_Bridge模式bridge模式动机案例要点总结笔记动机由于某些类型的固有的实现逻辑,使得他们具有两个变化维度,乃至多个维度的变换如何应对这种”多维度的变化“?如何利用面向对象技术来是使得类型可以轻松地沿着两个乃至多个方向变换而不引入额外地复杂度?案例PC端和Mobile端平台和业务分离朴素class Messager{ public: virtual void Login(string username,string password) = 0; virtual void SendM

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

动机

由于某些类型的固有的实现逻辑,使得他们具有两个变化维度,乃至多个维度的变换

如何应对这种”多维度的变化“?如何利用面向对象技术来是使得类型可以轻松地沿着两个乃至多个方向变换而不引入额外地复杂度?

模式定义

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

案例

PC端和Mobile端平台和业务分离
朴素

class Messager{ 

public:
virtual void Login(string username,string password) = 0;
virtual void SendMessage(string message) = 0;
virtual void SendMessage(Image image) = 0;
virtual void PlaySound() = 0;
virtual void PlayShape() = 0;
virtual void WriteText() = 0;
virtual void Connect() = 0;
virtual ~Messager(){ 
}
}
//平台实现
class PCMessagerBase : public Messager{ 

public:
virtual void PlaySound(){ 

//...
}
virtual void DrawSHape(){ 

//,,
}
virtual void WriteText(){ 

//..
}
virtual void connect(){ 

//,,
}
}
class MobileMessagerBase : public Messager{ 

public:
virtual void PlaySound(){ 

//...
}
virtual void DrawSHape(){ 

//,,
}
virtual void WriteText(){ 

//..
}
virtual void connect(){ 

//,,
}
}
//业务抽象
//精简版
class PCMessageLite : public PCMessagerBase{ 

public :
virtual void Login(string username,string password){ 

PCMessagerBase::Connect();
//..
}
virtual void SendMessage(string message){ 

PCMessagerBase::WriteText();
//..
}
virtual void SendPicture(Image image){ 

PCMessagerBase::DrawShape();
//..
}
}
//完美版
class PCMessagePerfect : public PCMessagerBase{ 

public :
virtual void Login(string username,string password){ 

PCMessagerBase::PlaySound();
//....
PCMessagerBase::Connect();
//...
}
virtual void SendMessage(string message){ 

PCMessagerBase::PlaySound();
//...
PCMessagerBase::WriteText();
//...
}
virtual void SendPicture(Image image){ 

PCMessagerBase::PlaySound();
//...
PCMessagerBase::DrawShape();
//...
}
}
//精简版
class MobileMessageLite : public MobileMessagerBase{ 

public :
virtual void Login(string username,string password){ 

MobileMessagerBase::Connect();
//..
}
virtual void SendMessage(string message){ 

MobileMessagerBase::WriteText();
//..
}
virtual void SendPicture(Image image){ 

MobileMessagerBase::DrawShape();
//..
}
}
//完美版
class MobileMessagerPerfect : public MobileMessagerBase{ 

public :
virtual void Login(string username,string password){ 

MobileMessagerPerfect::PlaySound();
//....
MobileMessagerPerfect::Connect();
//...
}
virtual void SendMessage(string message){ 

MobileMessagerPerfect::PlaySound();
//...
MobileMessagerPerfect::WriteText();
//...
}
virtual void SendPicture(Image image){ 

MobileMessagerPerfect::PlaySound();
//...
MobileMessagerPerfect::DrawShape();
//...
}
}

Bridge桥模式

class Messager{ 

private:
MessagerImp * messager;
public:
Messager():messager(messager){ 

}
virtual void Login(string username,string password) = 0;
virtual void SendMessage(string message) = 0;
virtual void SendMessage(Image image) = 0;
virtual ~Messager(){ 
}
}
class MessagerImp{ 

public:
virtual void PlaySound() = 0;
virtual void PlayShape() = 0;
virtual void WriteText() = 0;
virtual void Connect() = 0;
virtual ~MessagerImp(){ 
}
}
//平台实现
class PCMessagerImp : public MessagerImp{ 

public:
virtual void PlaySound(){ 

//...
}
virtual void DrawSHape(){ 

//,,
}
virtual void WriteText(){ 

//..
}
virtual void connect(){ 

//,,
}
}
class MobileMessagerImp : public MessagerImp{ 

public:
virtual void PlaySound(){ 

//...
}
virtual void DrawSHape(){ 

//,,
}
virtual void WriteText(){ 

//..
}
virtual void connect(){ 

//,,
}
}
//业务抽象
//精简版
class PCMessageLite : public Messager{ 

public :
virtual void Login(string username,string password){ 

messageImp->Connect();
//..
}
virtual void SendMessage(string message){ 

messageImp->WriteText();
//..
}
virtual void SendPicture(Image image){ 

messageImp->DrawShape();
//..
}
}
//完美版
class PCMessagePerfect : public Messager{ 

public :
virtual void Login(string username,string password){ 

messageImp->PlaySound();
//....
messageImp->Connect();
//...
}
virtual void SendMessage(string message){ 

messageImp->PlaySound();
//...
messageImp->WriteText();
//...
}
virtual void SendPicture(Image image){ 

messageImp->PlaySound();
//...
messageImp->DrawShape();
//...
}
}
//精简版
class MobileMessageLite : public Messager{ 

public :
virtual void Login(string username,string password){ 

messageImp->Connect();
//..
}
virtual void SendMessage(string message){ 

messageImp->WriteText();
//..
}
virtual void SendPicture(Image image){ 

messageImp->DrawShape();
//..
}
}
//完美版
class MobileMessagerPerfect : public Messager{ 

public :
virtual void Login(string username,string password){ 

messageImp->PlaySound();
//....
messageImp->Connect();
//...
}
virtual void SendMessage(string message){ 

messageImp->PlaySound();
//...
messageImp->WriteText();
//...
}
virtual void SendPicture(Image image){ 

messageImp->PlaySound();
//...
messageImp->DrawShape();
//...
}
}
void Process(){ 

//运行时装配
MessagerImp *mImp = new PCMessagerImp();
Messager *m = new MobileMessagerPerfect(mImp);
}

要点总结

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

笔记

  • 一个类中最好只有一个功能方向,如果有多个 ,就拆分成不同地类
  • 多个维度:比如说 业务功能和平台实现
  • 将某一个变换维度合在一起 打包成一个基类 用一个抽象指针指向它。如果有3个维度则把3个不分摘出来 用3个抽象指针指向它们
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/169043.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • BI—脚不一样的感觉

    BI—脚不一样的感觉

  • Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate 初遇

    Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate 初遇目录环境准备新建项目pom.xml默认内容mysql数据库数据库CRUD全局配置文件默认数据源CRUD数据库PhoneController测试结果自动配置原理DataSourceConfiguration1、《SpringBoot数据库访问简介》中已经介绍,SpringBoot可以通过多种方式访问各种数据库,本文将介绍Spr…

  • c语言图书管理系统出现的问题,C语言图书管理系统中的问题「建议收藏」

    c语言图书管理系统出现的问题,C语言图书管理系统中的问题「建议收藏」系统使用细分的功能模块c语言图书管理系统,分别在main.c文件中调用.开发环境为Win7,Netbeans8.0.2这是main.c#include#include#include#include“bmenu.h”#include“search_allinformation.h”typedefstructbookinfo{字符数[20];/*书号*/字符名称[40];/*书…

    2022年10月11日
  • msm8953 uart配置

    msm8953 uart配置参考链接:MSM8937-MSM8953UART配置调试指南uart驱动是使用内核驱动,无需自己编写,一般只需修改设备树。一、修改设备树设备树的配置有三部分:1.msm8953.dtsi中添加code blsp2_uart2:serial@7af0000{ compatible=”qcom,msm-lsuart-v14″; reg=<0x7af00000x…

  • JS中clientHeight、scrollHeight和offsetHeight的大坑,滚动条抖动问题解决

    JS中clientHeight、scrollHeight和offsetHeight的大坑,滚动条抖动问题解决JS中clientHeight、scrollHeight和offsetHeight的大坑,滚动条抖动问题解决1.什么是clientHeight、scrollHeight和offsetHeight1.1clientHeight是什么1.2offsetHeight是什么1.3clientHeight和offsetHeight的注意点1.4scrollHeight和它的大坑jQuery和原生js…

  • stc12c5a60s2功能说明(STC12C5A60S2默认触发)

    最近学习一下SD卡的驱动,网上程序的版本很多,使用的MCU和SD卡的型号千奇百怪,学起来反而没有方向,感觉上乱七八糟的,直到现在,才直到我们平常说的SD卡实际上有很多中类别。0到2G的SD卡,最普通的卡;2G到32G的SDHC卡,也就是现在最常用的大容量SD卡;还有我没有见过的SDXC卡,容量好像在32G以上。同时还有手机上的TF卡,实际上也是SD卡只不过做工不同而已,MMC卡。学习的时候走了很

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号