首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >bridge桥接模式_透明桥模式

bridge桥接模式_透明桥模式

作者头像
全栈程序员站长
发布2022-09-22 14:15:30
发布2022-09-22 14:15:30
1.3K0
举报

大家好,又见面了,我是你们的朋友全栈君。

bridge模式

动机

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

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

模式定义

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

案例

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

代码语言:javascript
复制
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桥模式

代码语言:javascript
复制
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.cn/168512.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • bridge模式
  • 动机
  • 模式定义
  • 案例
  • 要点总结
  • 笔记
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档