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)


相关推荐

  • C#开发微信公众平台-就这么简单(转载)(附原文链接)

    C#开发微信公众平台-就这么简单(转载)(附原文链接)

    2021年11月17日
  • text-decoration

    text-decoration

  • SpringBoot面试题及答案 110道(持续更新)

    SpringBoot面试题及答案 110道(持续更新)最新SpringBoot面试题【附答案解析】SpringBoot面试题及答案,SpringBoot最新面试题及答案,SpringBoot面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案难免会存在一些错误,仅供大家参考。如果发现错误还望大家多多包涵,不吝赐教,谢谢~如果不背SpringBoot面试题的答案,肯定面试会挂!这套SpringBoot面试题大全,希望对大家有帮助哈~博主已将以下这些面试题整理成了一个面试手册,是PDF版的1、SpringBo

  • String.Split()函数

    String.Split()函数

    2021年11月13日
  • 游戏协议测试理论(游戏测试是什么)

    转载:https://blog.csdn.net/SR0ad/article/details/8253126协议测试:针对通信协议进行的测试,是对常规测试的一种补充。重要性:实现一些常规测试中无法实现的流程,修改通信数据包检测服务器异常处理,修改数据包的先后次序检查服务器处理流程。协议测试的主要测试点:1.数据类型溢出:通信双方对协议数据类型的解析不一致,导致内存操作错误。2.数据包…

  • Java堆结构PriorityQueue完全解析

    Java堆结构PriorityQueue完全解析在堆排序这篇文章中千辛万苦的实现了堆的结构和排序,其实在Java1.5版本后就提供了一个具备了小根堆性质的数据结构也就是优先队列PriorityQueue。下面详细了解一下PriorityQueue到底是如何实现小顶堆的,然后利用PriorityQueue实现大顶堆。PriorityQueue的数据结构PriorityQueue的逻辑结构是一棵完全二叉树,存储结构其实是一个数组。逻辑结构层次遍历的

发表回复

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

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