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/168512.html原文链接:https://javaforall.cn

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

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

(0)


相关推荐

  • WKT_WK是什么品牌

    WKT_WK是什么品牌WKT-概念WKT(Well-knowntext)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式,亦即WKB(well-knownbinar

  • 一千行 MySQL 学习笔记

    一千行 MySQL 学习笔记

    2021年10月25日
  • mysql批量插入大量数据「建议收藏」

    mysql批量插入大量数据「建议收藏」mysql批量插入大量数据时间:2020年11月25日今天遇到了一个批量插入大量数据任务,然后出于小白本能,直接for-each循环插入不就好了,于是手上开始噼里啪啦一顿操作,写好了从读取excel到插入数据库的工作,于是就美滋滋的开始了自己的测试,试了一把,一次通过perfect,然后后面就悲剧了,后面发现数据量稍微大一点,速度就会很慢很慢。于是掏出自己的制胜法典,后来我在知识和海洋中获取到了两种靠谱的方法。下面一点一点讲。测试的服务器信息1核2g5m的阿里云服务器(你懂得),mysql直接装

  • 给织梦DEDECMS添加栏目图片与英文名显示

    给织梦DEDECMS添加栏目图片与英文名显示

  • [奶奶看了都会]教你用脚本薅京东签到羊毛

    [奶奶看了都会]教你用脚本薅京东签到羊毛又到了周末的时间,每次周末都得整点花里胡哨的东西玩,今天就来说说怎么用Python脚本自动完成京东签到领京豆

  • GTX 750等低配显卡如何玩转Deepfakes?[通俗易懂]

    GTX 750等低配显卡如何玩转Deepfakes?[通俗易懂]这里说的Deepfakes软件还是DeepFaceLab,人工智能换脸,是使用深度学习方法来实现的。而深度学习程序对电脑配置要求是非常高的,尤其是跑模型这个环节。很多低配电脑,根本就跑步起来。比如像GTX750,1G显存。默认情况下这种配置肯定跑不了这个程序,但是通过自定义参数也能跑。这对于低配玩家来说绝对是个好消息。首先,你需要获取的DFL的版本为DeepFaceLabCUDA…

发表回复

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

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