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个抽象指针指向它们
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168512.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • List 去重的 6 种方法[通俗易懂]

    List 去重的 6 种方法[通俗易懂]方法1:contains判断去重(有序)要进行数据去重,我们首先想到的是新建一个集合,然后循环原来的集合,每次循环判断原集合中的循环项,如果当前循环的数据,没有在新集合中存在就插入,已经存在了就舍弃,这样当循环执行完,我们就得到了一个没有重复元素的集合了,实现代码如下:publicclassListController{publicstaticvoidmain(String[]args){List<Integer>list=newArra

    2022年5月26日
    47
  • 阿里Java高级工程师面试题(含答案)

    阿里Java高级工程师面试题(含答案)1,java堆,分新生代老年代,新生代有Eden,fromsurviver,tosurviver三个空间,堆被所有线程共。eden内存不足时,发生一次minorGC,会把fromsurvivor和eden的对象复制到tosurvivor,这次的to&amp;amp;amp;nbsp;survivor就变成了下次的fromsurvivor,经过多次minorGC,默认15次,达到次数的对象会从survivor…

    2022年5月2日
    46
  • QinQ、VLAN Mapping原理和配置「建议收藏」

    QinQ、VLAN Mapping原理和配置「建议收藏」我唯一知道的就是我一无所知。—苏格拉底文章目录一、QinQ基本原理二、VLANMapping基本原理三、拓扑四、配置与分析五、总结一、QinQ基本原理QinQ是指在802.1QVLAN的基础上增加一层802.1QVLAN标签,从而拓展VLAN的使用空间。在公网的传输过程中,设备只根据外层VLANTag转发报文,并根据报文的外层VLANTag进行MAC地址学习,而用户的私网VLANTag将被当作报文的数据部分进行传输。1、QinQ报文封装格式QinQ报文有.

    2022年8月10日
    4
  • 我的校园服务小程序_有创意校园的微信小程序

    我的校园服务小程序_有创意校园的微信小程序微信小程序——校园服务小程序(四)校园论坛加预约理发服务上一篇介绍了如何用户如何将帖子的内容发送到数据库中。这次我们来介绍一下如何将库中数据渲染出来,通过get得到对应表的数据,在wxml上通过for循环渲染数据表中的值。这里以我们的主页面为例,首先思考一下,一个展示帖子的主页面要有什么功能,1.帖子在添加时会将新的帖子放在最后,再渲染时也会被渲染在后面,这样是不可以的,每一次进入界面都是第一个用户上传的帖子。这里我们需要对帖子进行一次排序,这里我使用了orderBy(‘timeone’,‘d

    2022年9月20日
    0
  • jvm垃圾回收详解_java 垃圾回收器

    jvm垃圾回收详解_java 垃圾回收器JVM垃圾回收1.概述JVM会自动帮程序员进行垃圾回收,并不需要程序员手动的进行垃圾回收(C++等语言需要自己手动回收垃圾),了解JVM的垃圾回收,可以帮程序员写出占用内存更小、更高效的程序。1.1什么是垃圾?垃圾是指运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。1.2什么区域需要进行垃圾回收JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭,因此这几个区域的内存分配和回

    2022年9月12日
    0
  • Pytest(11)allure报告「建议收藏」

    Pytest(11)allure报告「建议收藏」前言allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面。mac环境:

    2022年7月31日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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