桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化改变而互不影响。
桥接模式的目的是将抽象与实现分离,使它们可以独立地变化,该模式通过将一个对象的抽象部分与它的实现部分分离,使它们可以独立地改变。它通过组合的方式,而不是继承的方式,将抽象和实现的部分连接起来。
桥接模式的几个关键角色:
- 抽象(Abstraction): 定义抽象接口,通常包含对实现接口的引用。抽象类是对高层业务逻辑的抽象,它包含了对实现的引用,并定义了高层次的操作。它可以是一个抽象类或者一个接口。
- 扩展抽象(Refined Abstraction): 对抽象的扩展,可以是抽象类的子类或具体实现类。扩展抽象类在抽象的基础上添加更多的功能或进行定制,同时仍然通过实现接口来调用实现。
- 实现(Implementor): 定义实现接口,提供基本操作的接口。实现接口是对底层操作的抽象,它可能是一个接口或者抽象类,定义了基本的操作方法。
- 具体实现(Concrete Implementor): 实现实现接口的具体类。具体实现类实现了底层的具体操作,供抽象和扩展抽象类调用。
- 增加灵活性: 如果系统需要在抽象和具体实现之间增加更多的灵活性,避免静态的继承关系,桥接模式是一个不错的选择。它允许抽象和实现独立变化,使得系统更容易扩展和维护。
- 避免多层次继承: 当系统不希望使用多层次继承,或者继承层次导致类的个数急剧增加时,桥接模式是一种有效的替代方案。通过桥接模式,可以减少继承的层次,将抽象和实现分离,避免类层次结构的膨胀。
- 独立变化的维度: 当一个类存在两个或多个独立变化的维度,且这些维度都需要进行扩展时,桥接模式非常适用。通过桥接模式,可以灵活地组合不同的抽象和实现,而不需要创建所有可能的组合,从而降低了系统的复杂性。
在这个例子中,我们有两个维度:Shape
和 Color
。Shape
表示图形,Color
表示颜色。通过桥接模式,我们可以轻松地组合不同的形状和颜色。
#include <iostream>
// 实现接口
class Color
{
public:
virtual void applyColor() = 0;
};
// 具体实现类
class Red : public Color
{
public:
void applyColor() override
{
std::cout << "Applying red color" << std::endl;
}
};
class Green : public Color
{
public:
void applyColor() override
{
std::cout << "Applying green color" << std::endl;
}
};
// 抽象类
class Shape
{
protected:
Color *color;
public:
Shape(Color *color) : color(color) {}
virtual void draw() = 0;
};
// 扩展抽象类
class Circle : public Shape
{
public:
Circle(Color *color) : Shape(color) {}
void draw() override
{
std::cout << "Drawing circle ";
color->applyColor();
}
};
class Rectangle : public Shape
{
public:
Rectangle(Color *color) : Shape(color) {}
void draw() override
{
std::cout << "Drawing rectangle ";
color->applyColor();
}
};
int main()
{
// 创建具体的形状和颜色
Color *red = new Red();
Color *green = new Green();
Shape *redCircle = new Circle(red);
Shape *greenRectangle = new Rectangle(green);
// 绘制
redCircle->draw();
greenRectangle->draw();
// 释放资源
delete red;
delete green;
delete redCircle;
delete greenRectangle;
return 0;
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END