桥接模式(Bridge)------结构型模式
桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。
假如有三个类Circle
、triangle
和rectangle
,现在要在此基础上为每个类新添加三个颜色属性blue
、green
和 red
,这时候我们用继承 的方式实现,则还需新添加9个类,以保证所有组合。如果再加一个维度呢?比如说再添加三种边框实线
、虚线
和双线
,那么就需要再添加27个类。类的数量呈指数型上升,在设计上称之为类爆炸。
桥接模式通过将继承改为组合的方式来解决这个问题。 具体来说就是将各个维度抽象出来,并选择一个维度作为基座,这样就可以在基维度类中引用其它类,从而使得一个类不必拥有所有的状态和行为。
例如上例,可以抽象出形状
和 颜色
两个维度,选择形状
作为基座并包含颜色的引用
,引用充当一个桥梁的作用,这样就可以灵活的进行组合。对于三个维度各三个属性的情况,只需要定义9个类即可(不算抽象类),从而避免继承模式导致的类爆炸。
C++ 实例:
cpp
#include <iostream>
#include <string>
// 颜色接口
class Color {
public:
virtual std::string getColor() = 0;
virtual ~Color() {}
};
// 红色实现类
class RedColor : public Color {
public:
std::string getColor() override {
return "Red";
}
};
// 蓝色实现类
class BlueColor : public Color {
public:
std::string getColor() override {
return "Blue";
}
};
// 形状接口
class Shape {
protected:
Color* color;
public:
Shape(Color* color) : color(color) {}
virtual void draw() = 0;
virtual ~Shape() {}
};
// 圆形
class Circle : public Shape {
public:
Circle(Color* color) : Shape(color) {}
void draw() override {
std::cout << "Drawing Circle with color " << color->getColor() << std::endl;
}
};
// 矩形
class Rectangle : public Shape {
public:
Rectangle(Color* color) : Shape(color) {}
void draw() override {
std::cout << "Drawing Rectangle with color " << color->getColor() << std::endl;
}
};
int main() {
Color* red = new RedColor();
Color* blue = new BlueColor();
Shape* redCircle = new Circle(red);
Shape* blueRectangle = new Rectangle(blue);
redCircle->draw();
blueRectangle->draw();
delete blueRectangle;
delete redCircle;
delete blue;
delete red;
return 0;
}