桥接模式:把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。事物对象仅是一个抽象的概念。如“圆形”、“三角形”归于抽象的“形状”之下,而“画圆”、“画三角”归于实现行为的“画图”类之下,然后由“形状”调用“画图”。“形状”成为一个继承体系,“画图”成为另一个继承体系,抽象和实现两者的关系为聚合关系。UML图如下:
- Abstraction:定义抽象的接口,该接口包含实现具体行为、具体特征的Implementor接口
- Refined Abstraction:抽象接口Abstraction的子类,依旧是一个抽象的事物名
- Implementor:定义具体行为、具体特征的应用接口
- ConcreteImplementor:实现Implementor接口
下面是用C++描述的桥接模式的框架:
#include <iostream>
#include <string>
using namespace std;
// 实现
class Implementor {
public:
virtual void Operation() = 0;
};
// 具体实现A
class ConcreteImplementorA : public Implementor {
public:
void Operation()
{
cout << "执行具体实现A中的方法" << endl;
}
};
// 具体实现B
class ConcreteImplementorB : public Implementor {
public:
void Operation()
{
cout << "执行具体实现B中的方法" << endl;
}
};
// 抽象
class Abstraction {
public:
void SetImplementor(Implementor *i)
{
implementor = i;
}
virtual void Operation() = 0;
~Abstraction()
{
delete implementor;
}
protected:
Implementor *implementor; // 包含一个实现
};
// 被提炼的抽象
class RefineAbstraction : public Abstraction {
public:
void Operation()
{
implementor->Operation();
}
};
int main()
{
Abstraction *ab = new RefineAbstraction();
ab->SetImplementor(new ConcreteImplementorA());
ab->Operation();
ab->SetImplementor(new ConcreteImplementorB());
ab->Operation();
// 别忘记删除指针
delete ab;
system("pause");
return 0;
}
运行结果:
上面的例子实现了抽象Abstraction和实现Implementor分离,抽象中包含实现。但具体是哪种实现(ConcreteImplementorA或ConcreteImplementorB)是由客户端决定的。当需要添加抽象时,只需要继承Abstraction即可;当需要添加具体实现时,继承Implementor即可。这样既降低了耦合度,也符合开放-封闭原则,即:功能的扩充不需要修改原来的代码而只需要添加所需新的代码。
参考:
《大话设计模式》第22章
维基百科