1.概述
桥接模式是一种结构型设计模式,是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化改变而互不影响。
2.结构
- 抽象(Abstraction): 该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现,抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象);
- 修正抽象(RefinedAbstraction): Abstraction的具体实现,对Abstraction的方法进行完善和扩展;
- 实现(Implementor): 确定实现维度的基本操作,提供给Abstraction使用。该类一般为接口或者抽象类;
- 具体实现(ConcreteImplementor): Implementor的具体实现;
3.实现
假设你有一个几何 形状
Shape类, 从它能扩展出两个子类: 圆形
Circle和 方形
Square 。 如果继续对这样的类层次结构进行扩展以使其包含颜色, 创建名为 红色
Red和蓝色
Blue的形状子类。由于你已有两个子类, 所以总共需要创建四个类才能覆盖所有组合,具体为蓝色圆形、红色圆形、
蓝色方形、红色方形
。
从上述例子可知每增加一种颜色或者一种形状将导致代码复杂程度指数增长。 如此以往, 情况会越来越糟糕。
桥接模式通过将继承改为组合的方式来解决这个问题。 具体来说, 就是抽取其中一个维度并使之成为独立的类层次, 这样就可以在初始类中引用这个新层次的对象, 从而使得一个类不必拥有所有的状态和行为。
根据该方法, 我们可以将颜色相关的代码抽取到拥有
红色
和蓝色
两个子类的颜色类中, 然后在形状
类中添加一个指向某一颜色对象的引用成员变量。 现在, 形状类可以将所有与颜色相关的工作委派给连入的颜色对象。 这样的引用就成为了形状
和颜色
之间的桥梁。 此后, 新增颜色将不再需要修改形状的类层次, 反之亦然。
3.1具体实现
类图如下:
#include <iostream>
using namespace std;class Color {
public:virtual void Spray() = 0;
};class Red :public Color {public:void Spray() override {cout << "喷涂红色..." << endl;}
};class Blue :public Color {public:void Spray() override {cout << "喷涂红色..." << endl;}};class Shape {protected:Color* color_;
public:Shape(Color* color) : color_(color) {}virtual void draw() {cout <<"Abstraction: Base draw ... \n" << endl;return ;}};class Circle :public Shape {public:Circle(Color* color) : Shape(color) {}void draw() override {cout << "画圆形..." << endl;color_->Spray();}
};int main()
{cout << "------桥接模式------" << endl;Shape *shape1 = new Circle(new Red());shape1->draw();Shape *shape2 = new Circle(new Blue());shape2->draw();return 0;
}
3.2运行结果
4.状态设计模式优缺点
优点:
- 抽象和实现的分离。
- 优秀的扩展能力。
- 符合开闭原则、合成复用原则。
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
5.应用场景
- 当一个类需要在多个维度上变化时,使用继承会导致类极具增长时。
- 当一个类需要独立地变化其抽象部分和实现部分时。
- 当需要在抽象部分和实现部分之间建立一种透明的连接关系时。