更多设计模式参看: 设计模式之模式概述(模式汇总)(C++实现)
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
对于桥接模式“最纯正”的理解方式,当属 GoF 的《设计模式》一书中对桥接模式的定义。
Decouple an abstraction from its implementation so that the two can vary independently。
翻译成中文就是:“将抽象和实现解耦,让它们可以独立变化。
定义中的“抽象”,指的并非“抽象类”或“接口”,而是被抽象出来的一套**“类库”,它只包含骨架代码,真正的业务逻辑需要委派给定义中的“实现”来完成。而定义中的“实现”,也并非“接口的实现类”,而是一套独立的“类库”。“抽象”和“实现”独立开发,通过对象之间的组合关系**,组装在一起。
关于桥接模式,很多书籍、资料中,还有另外一种理解方式:
一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。
通过组合关系来替代继承关系,避免继承层次的指数级爆炸。
在软件开发中如果一个类或一个系统有多个变化维度时,都可以尝试使用桥接模式对其进行设计,桥接模式为多维度变化的系统提供了一套完整的解决方案,并且降低了系统的复杂度。
把多角度变化分离出来,让它们独立变化,减少它们之间耦合。
将两个或多个独立变化的维度设计为两个或多个独立的继承等级结构,并且在抽象层建立一个或多个抽象关联,这些关联关系类似一条条连接两个独立继承结构的桥,故名桥接模式。
用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系。
(1)如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。
(2)“抽象部分”和“实现部分”可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
(3)一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
(4)对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
Abstraction(抽象类) : 用于定义抽象类的接口,它一般是抽象类,定义了一个Implementor(实现类接口)类型的对象,与其之间具有关联关系,从而分离抽象接口与实现部分
RefinedAbstraction(扩充抽象类): 扩充由Abstraction定义的接口,通常情况下它是具体类,实现Abstraction的抽象业务方法,并可以调用在Implementor中定义的业务方法。
Implementor(实现类接口): 定义实现类的接口,Implementor接口声明了一些基本操作,而具体实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系。
ConcreteImplementor(具体实现类): 具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现。
绘制不同形状(Circle 、Rectangle )不同颜色(Red、Green、Blue)的图形(Shape)
Abstraction(抽象类) :ShSape
RefinedAbstraction(扩充抽象类):Circle 、Rectangle
Implementor(实现类接口): Color
ConcreteImplementor(具体实现类):Red、Green、Blue
BridgePattern
/// Implementor(实现类接口): Color
class Color {
public:
virtual ~Color() = default;
virtual void fillColor() = 0;
};
/// ConcreteImplementor(具体实现类):Red、Green、Blue
class Red : public Color {
public:
Red() {
std::cout << "Red Hello" << std::endl;
colorType = "Red";
}
~Red() override {
std::cout << "Red Bye" << std::endl;
}
void fillColor() override {
std::cout << "填充颜色: " << colorType << std::endl;
}
private:
std::string colorType;
};
class Green : public Color {
public:
Green() {
std::cout << "Green Hello" << std::endl;
colorType = "Green";
}
~Green() override {
std::cout << "Green Bye" << std::endl;
}
void fillColor() override {
std::cout << "填充颜色: " << colorType << std::endl;
}
private:
std::string colorType;
};
class Blue : public Color {
public:
Blue() {
std::cout << "Blue Hello" << std::endl;
colorType = "Blue";
}
~Blue() override {
std::cout << "Blue Bye" << std::endl;
}
void fillColor() override {
std::cout << "填充颜色: " << colorType << std::endl;
}
private:
std::string colorType;
};
/// Abstraction(抽象类) : Shape
class Shape {
public:
virtual ~Shape() = default;
virtual void showShape() = 0;
virtual void chooseColor(Color *col) = 0;
protected:
virtual void drawShape() = 0;
virtual void drawColor() = 0;
Color *color = nullptr;
/// RefinedAbstraction(扩充抽象类):Circle 、Rectangle
class Circle : public Shape {
public:
Circle() {
std::cout << "Circle Hello" << std::endl;
shapeType = "Circle";
}
~Circle() override {
std::cout << "Circle Bye" << std::endl;
delete color;
}
void showShape() override {
drawShape();
drawColor();
}
void chooseColor(Color *col) override {
color = col;
}
private:
void drawShape() override {
std::cout << "绘制图形: " << shapeType << std::endl;
}
void drawColor() override {
color->fillColor();
}
std::string shapeType;
};
class Rectangle : public Shape {
public:
Rectangle() {
std::cout << "Rectangle Hello" << std::endl;
shapeType = "Rectangle";
}
~Rectangle() override {
std::cout << "Rectangle Bye" << std::endl;
delete color;
}
void showShape() override {
drawShape();
drawColor();
}
void chooseColor(Color *col) override {
color = col;
}
private:
void drawShape() override {
std::cout << "绘制图形: " << shapeType << std::endl;
}
void drawColor() override {
color->fillColor();
}
std::string shapeType;
};
int main() {
Shape *shape;
//绘制 红色 圆形
std::cout << "=====绘制 红色 圆形=====" << std::endl;
shape = new Circle();
shape->chooseColor(new Red());
shape->showShape();
delete shape;
//绘制 绿色 圆形
std::cout << "=====绘制 绿色 圆形=====" << std::endl;
shape = new Circle();
shape->chooseColor(new Green());
shape->showShape();
delete shape;
//绘制 蓝色 矩形
std::cout << "=====绘制 蓝色 矩形=====" << std::endl;
shape = new Rectangle();
shape->chooseColor(new Blue());
shape->showShape();
delete shape;
return 0;
}
个人能力有限,如有错误之处或者其他建议,敬请告知欢迎探讨,谢谢!