【设计模式】之二十三种设计模式--桥梁模式

桥梁模式

Decouple an abstraction from its implementation so that the two can vary independently.

(将抽象和实现解耦,使得两者可以独立地变化。)

通用类图

抽象化角色

定义出类的行为,同时保存一个对实现类的引用

实现化角色

依赖抽象化角色类,接口或抽象类,定义角色必须的行为和属性

修正抽象化角色

继承抽象化角色类,引用实现化角色对抽象化角色进行修正

具体实例化角色

继承实现化角色类,实现接口或抽象类定义的方法和属性

通用源码

//实现化角色
class Implementor {
public:
    virtual void doSomething() = 0;
    virtual void doAnything() = 0;
};
//具体实例化角色
class ConcreteImplementor1 : public Implementor {
public:
    void doSomething() override {
        //业务逻辑处理
    }
    void doAnything() override {
        //业务逻辑处理
    }
};
//抽象化角色
class Abstraction {
private:
    //定义对实现化角色的引用
    Implementor *impl;
public:
    约束子类必须实现该构造函数
    Abstraction(Implementor* i): impl(i) { }
    //自身的行为和属性
    void request() {
        impl->doSomething();
    }
    //获得实现化角色
    Implementor* getImp() { return impl; }
};
//具体抽象化角色
class RefinedAbstraction : public Abstraction {
public:
    RefinedAbstraction(Implementor* i): Abstraction(i) { }
    void request() {
        //业务逻辑处理
        Abstraction::request();
        Abstraction::getImp()->doAnything();
    }
};

优点

抽象和实现分离

优秀的扩充能力

实现细节对客户透明

使用场景

不希望或不适用使用继承的场景

接口或抽象类不稳定的场景

重用性要求较高的场景

注意事项

如何拆分抽象和实现是关键。

示例代码

#include <iostream>
#include <string>

using namespace std;

class Product {
public:
    virtual void beProducted() = 0;
    virtual void beSelled() = 0;
};

class House : public Product {
public:
    void beProducted() override {
        cout << "construct such house...\n";
    }
    void beSelled() override {
        cout << "sell such house...\n";
    }
};

class Ipod : public Product {
public:
    void beProducted() override {
        cout << "construct such iPod...\n";
    }
    void beSelled() override {
        cout << "sell such iPod...\n";
    }
};

class Crop {
public:
    Crop(Product *p) {
        product = p;
    }
    void makeMoney() {
        product->beProducted();
        product->beSelled();
    }
private:
    Product *product;
};

class HouseCrop : public Crop {
public:
    HouseCrop(House h): Crop(&h) { }
    void makeMoney() {
        Crop::makeMoney();
        cout << "HouseCrop make much money...\n";
    }
};

class ShanZhaiCrop : public Crop {
public:
    ShanZhaiCrop(Product *p): Crop(p) { }
    void makeMoney() {
        Crop::makeMoney();
        cout << "ShanZhaiCrop make much money...\n";
    }
};


int main() {
    House h;
    HouseCrop hc(h);
    hc.makeMoney();
    ShanZhaiCrop szc(new Ipod());
    szc.makeMoney();
    return 0;
}

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦