桥模式

作者: 钟离惜 | 来源:发表于2020-10-25 22:50 被阅读0次

    属于单一职责性设计模式,主要是将类多个方向的变化拆分成多个类独立方向的变化,使其职责保持单一。

    所以桥梁模式的用意是“将抽象化与实现化脱耦,使得二者可以独立地变化”。
    处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。

    比如下面这个多继承结构,一是不符合“开-闭”原则,二是需要的类非常多,编码重复性较高。


    如果单独把图形和颜色拆分开,实现解耦,让二者独立变化,


    类变化的方向隐含着类的责任,让多个方向拆开,一个采用继承,一个采用组合,甚至多个组合的方式,我的理解是这个继承的类型相当于一座桥梁,连接了多个方向的变化,所以称为桥模式。

    示例代码

    #include <iostream>
    
    
    using namespace std;
    
    
    // ============================================
    // 枪械基类
    class Gun_base {
    public:
        virtual ~Gun_base() {}
    
        virtual void fire() const = 0;
    };
    
    
    // 手枪
    class Pistol : public Gun_base {
    public:
        void fire() const {
            cout << "手枪发射—— biu biu biu!" << endl;
        }
    };
    
    
    // 步枪
    class Rifle : public Gun_base {
    public:
        void fire() const {
            cout << "步枪发射—— tu tu tu!" << endl;
        }
    };
    
    
    // 狙击枪
    class Awp :public Gun_base {
    public:
        void fire() const {
            cout << "狙击枪发射—— peng!" << endl;
        }
    };
    // ============================================
    
    
    // ============================================
    // 战士基类
    class Fighter_base {
    public:
        virtual ~Fighter_base() {}
    
        virtual void fight(Gun_base* gun) const = 0;
    };
    
    
    // 战士A
    class Fighter_A : public Fighter_base {
    public:
        void fight(Gun_base* gun) const {
            cout << "我是战士A! ———— ";
            gun->fire();
        }
    };
    
    
    // 战士B
    class Fighter_B : public Fighter_base {
    public:
        void fight(Gun_base* gun) const {
            cout << "我是战士B! ———— ";
            gun->fire();
        }
    };
    
    
    // 战士C
    class Fighter_C : public Fighter_base {
    public:
        void fight(Gun_base* gun) const {
            cout << "我是战士C! ———— ";
            gun->fire();
        }
    };
    // ============================================
    
    
    int main() {
        // 创建三种枪
        Gun_base* gun_01 = new Pistol();
        Gun_base* gun_02 = new Rifle();
        Gun_base* gun_03 = new Awp();
    
        // 创建三种战士
        Fighter_base* A = new Fighter_A();
        Fighter_base* B = new Fighter_B();
        Fighter_base* C = new Fighter_C();
    
        // 不同战士搭配不同枪械展示
        C->fight(gun_02);
    
        delete gun_01;
        delete gun_02;
        delete gun_03;
    
        delete A;
        delete B;
        delete C;
    }
    
    

    参考文章
    设计模式(八)桥梁模式(Bridge)
    设计模式--桥接模式(桥模式)
    C++桥模式

    相关文章

      网友评论

          本文标题:桥模式

          本文链接:https://www.haomeiwen.com/subject/bglomktx.html