模式简介
桥接模式适用于系统有2个或者以上变化维度的情景,这种模式可以显示地降低类的个数,同时用户可以根据需求进行灵活地组合。
举个例子,假设我们有M个抽象类A的子类,有N个抽象类B的子类,A类族需要使用B类族的方法。如果是直接进行继承操作,即实现一个C类族,使得C类族同时继承自A、B族,那么需要 O ( M N ) O(MN) O(MN)级别的类个数,这样会造成系统过于膨胀。如果使用组合的方式,A类族内部包含一个B族基类的指针,这样A的子类可以根据需要来组合B的子类,此时需要 O ( M + N ) O(M+N) O(M+N)个方式,可以有效减少类的数量。
模式实现
class A {
public:
virtual void methodA() = 0; // A族的方法
};
class B {
public:
virtual void methodB() = 0; // B的方法,这里面需要A族的方法
virtual void setA(std::shared_ptr<A> p) { // 组合方法
m_spA = std::move(p);
}
private:
std::shared_ptr<A> m_spA;
};
UML类图
代码实例
假设我们有small
和big
两种画笔,每个画笔有多个颜色,现在需要不同的笔搭配不同的颜色,设计这样一个系统。
#include <iostream>
#include <memory>
class Color { // 抽象的颜色
public:
virtual void drawColor() = 0; // 颜色的方法
};
class Red : public Color {
public:
void drawColor() override {
std::cout << "Red!\n";
}
};
class Green : public Color {
public:
void drawColor() override {
std::cout << "Green!\n";
}
};
class Blue : public Color {
public:
void drawColor() override {
std::cout << "Blue!\n";
}
};
class Pen { // 抽象的笔
public:
virtual void paint() = 0; // 笔的抽象方法
};
class SmallPen : public Pen {
public:
void paint() override {
std::cout << "Small Pen: ";
m_spColor->drawColor();
}
void setColor(std::shared_ptr<Color> color) {
m_spColor = std::move(color);
}
private:
std::shared_ptr<Color> m_spColor;
};
class BigPen : public Pen {
public:
void paint() override {
std::cout << "Big Pen: ";
m_spColor->drawColor();
}
void setColor(std::shared_ptr<Color> color) {
m_spColor = std::move(color);
}
private:
std::shared_ptr<Color> m_spColor;
};
int main() {
SmallPen smallPen;
BigPen bigPen;
smallPen.setColor(std::make_shared<Red>());
smallPen.paint();
bigPen.setColor(std::make_shared<Green>());
bigPen.paint();
bigPen.setColor(std::make_shared<Blue>());
bigPen.paint();
return 0;
}
输出结果:
Small Pen: Red!
Big Pen: Green!
Big Pen: Blue!