首页 > 其他分享 >桥模式 Bridge

桥模式 Bridge

时间:2022-09-25 16:22:30浏览次数:43  
标签:Bridge string void virtual 模式 ........ PlaySound public

“单一职责”模式:

  • 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。
  • 典型模式
  1. Decorator
  2. Bridge

动机(Motivation)

  • 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。
  • 如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?

代码示例

装配式编译(伪代码):

class Messager{
public:
    virtual void Login(string username, string password)=0;
    virtual void SendMessage(string message)=0;
    virtual void SendPicture(Image image)=0;

    virtual void PlaySound()=0;
    virtual void DrawShape()=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 PCMessagerLite : 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 PCMessagerPerfect : 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 MobileMessagerLite : 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){
        
        MobileMessagerBase::PlaySound();
        //********
        MobileMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message){
        
        MobileMessagerBase::PlaySound();
        //********
        MobileMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image){
        
        MobileMessagerBase::PlaySound();
        //********
        MobileMessagerBase::DrawShape();
        //........
    }
};


void Process(){
        //编译时装配
        Messager *m =
            new MobileMessagerPerfect();
}

编译时装配:

基本思想,继承转组合。

#include <iostream>
#include <string>

using namespace std;

class MessagerImp;

/*这里拆分转化为组合*/
class Messager {
public:
    Messager(MessagerImp *mImp):messagerImp(mImp){}
    virtual ~Messager() {}
protected:
    // 重构理论:不同的派生类有同样的字段,把它往上提到基类。
    MessagerImp* messagerImp;//... 以后各种变化的情况
public:
    virtual void Login(string username, string password) = 0;
    virtual void SendMessage(string message) = 0;
    virtual void SendPicture(string image) = 0;
};

class MessagerImp {
public:
    virtual void PlaySound() = 0;
    virtual void DrawShape() = 0;
    virtual void WriteText() = 0;
    virtual void Connect() = 0;

    virtual ~MessagerImp() {}
};


//平台实现 n
class PCMessagerImp : public MessagerImp {
public:
    virtual void PlaySound() {
        //**********
        cout << "PC 端放声音" << endl;
    }
    virtual void DrawShape() {
        //**********
        cout << "PC 端画图" << endl;
    }
    virtual void WriteText() {
        //**********
        cout << "PC 端显示文案" << endl;
    }
    virtual void Connect() {
        //**********
        cout << "PC 端网络连接" << endl;
    }
};

class MobileMessagerImp : public MessagerImp {
public:
    virtual void PlaySound() {
        //==========
        cout << "移动端放声音" << endl;
    }
    virtual void DrawShape() {
        //==========
        cout << "移动端画图" << endl;
    }
    virtual void WriteText() {
        //==========
        cout << "移动端显示文案" << endl;
    }
    virtual void Connect() {
        //==========
        cout << "移动端网络连接" << endl;
    }
};


//业务抽象 m

//类的数目:1+n+m

class MessagerLite :public Messager { // 轻巧版
public:
    MessagerLite(MessagerImp *mImp):Messager(mImp){}

    virtual void Login(string username, string password) {
        messagerImp->Connect();
        std::cout << username << "已登录" << endl;
        //........
    }
    virtual void SendMessage(string message) {
        messagerImp->WriteText();
        //........
    }
    virtual void SendPicture(string image) {
        messagerImp->DrawShape();
        //........
    }
};


class MessagerPerfect :public Messager { // 完整版
public:
    MessagerPerfect(MessagerImp *mImp) :Messager(mImp) {}
    virtual void Login(string username, string password) {
        messagerImp->PlaySound();
        //********
        messagerImp->Connect();
        //........
        std::cout << username << "已登录" << endl;
    }
    virtual void SendMessage(string message) {

        messagerImp->PlaySound();
        //********
        messagerImp->WriteText();
        //........
    }
    virtual void SendPicture(string image) {

        messagerImp->PlaySound();
        //********
        messagerImp->DrawShape();
        //........
    }
};

void Process() {
    //运行时装配
    MessagerImp* mImp = new PCMessagerImp(); // PC端
    Messager *m = new MessagerLite(mImp);
    m->Login("周杰伦", "123"); //登录
    delete m; m = nullptr;
    cout << endl;
    m = new MessagerPerfect(mImp);
    m->Login("周杰伦", "123"); //登录

    delete mImp; mImp = nullptr;
    delete m; m = nullptr;
}


int main()
{
    Process();

    getchar();
    return 0;
}

输出:

PC 端网络连接
周杰伦已登录

PC 端放声音
PC 端网络连接
周杰伦已登录

类图

模式定义

将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。 ——《设计模式》GoF

要点总结

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




参考:BeekBand

标签:Bridge,string,void,virtual,模式,........,PlaySound,public
From: https://www.cnblogs.com/huvjie/p/16728065.html

相关文章

  • 装饰模式 Decorator
    “单一职责”模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。典型模式......
  • 设计模式 -- FactoryMethod(工厂方法)
    工厂方法(FactoryMethod)定义一个用于创建对象的接口,让子类决定实例化哪个类。FactoryMethod使得一个类的实例化延迟(目的:解耦)到子类。在软件系统中,经常会面临着创建对......
  • C#教程 - 模式匹配(Pattern matching)
    更新记录转载请注明出处:2022年9月25日发布。2022年9月10日从笔记迁移到博客。常见匹配模式类型匹配模式(typepattern)属性匹配模式(propertypattern)匹配模式可以......
  • 初识设计模式 - 原型模式
    简介对于大部分系统来说,创建对象包括申请内存、给成员变量赋值等过程,这些操作耗费的时间基本可以忽略不计。如果对象中的数据需要经过复杂的计算才能得到(比如排序、计算......
  • 策略模式 trategy
    “组件协作”模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的......
  • 建造者模式(创建型)
    建造者模式介绍建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造出一个复杂的对象。可以将建造者模式理解为,假设我们有一个对象需要建立,这个对象是由多个组......
  • 模板方法模式 Template Method
    “组件协作”模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的......
  • 微服务架构设计模式
    模块化是开发大型、复杂应用程序的基础微服务架构可以消除对某项技术栈的长期依赖微服务架构的弊端和问题:服务的拆分和定义是一项挑战;分布式系统带来的各种复杂性,使开......
  • token 登录模式了解过吗 ?
    token是服务器端生成的一个字符串,当作客服端请求的一个令牌,在第一次登陆成功之后,服务器端会生成一个token,客户端必须要携带token才能请求数据token的具体逻辑如下:......
  • 简明设计模式---桥接模式
    简述类型:结构型目的:通过抽离出多个维度相互组合(聚合)来代替继承,简化系统。话不多说,看个优化案例。优化案例现有系统中,对于画面窗口的边框有一套样式来控制是否有圆......