桥接模式(Bridge)
模式定义
+ 将抽象部分和实现接口分离,使它们可以独立变化。是一种结构性模式。
UML 图
时序图
角色定义
- 抽象类(Abstraction)
- 用于定义抽象类的接口,其中定义了一个 Implementation 实现类接口的对象,并可以维护该对象,它与 Implementation 具有关联关系
- 扩充抽象类(Refined Abstration)
- 扩充由 Abstraction 定义的接口,通常它不再是抽象类而是具体类,而是提供控制逻辑的变体。与父类一样,它们通过通用实现接口与不同的实现进行交互
- 实现类接口(Implementation)
- 为所有具体实现声明通用接口。抽象部分仅能通过在此处声明的方法与实现对象交互
- ConcreteImplementation(具体实现类)
- 实现具体的特定逻辑功能
优缺点
优点
- 分离抽象类极其实现部分。桥接模式使用"对象间的关联关系"解耦了抽象和实现之间独有的绑定关系,使得抽象和实现可以沿着各自的维度变化
- 桥接模式比多继承方法方案更好的解决方案
- 桥接模式提高了系统的可扩展性,在两个变化的维度中任意扩展一个维度,都不需要修改原有的系统
- 实现细节对客户透明,可以对用户隐藏细节。用户在使用时不需要关系实现,在抽象层通过聚合关联关系完成封装和对象组合
缺点
- 桥接模式的引入会增加系统的理解和设计难度。聚合关系建立在抽象层,要求开发者针对抽象进行设计和编程
- 桥接模式要求正确识别出系统的两个独立变化的维度,因此适用范围具有一定的局限性
应用场景
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行拓展时
- 当一个系统不希望使用继承或因为多层级的继承导致系统类的个数急剧增加时
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性是
代码实例
#include<iostream>
using namespace std;
class Serializer
{
public:
string m_string_ser;
virtual string getSerializer(){
cout << "Serializer::getSerializer " << endl;
// return m_string_ser;
}
};
class XmlSerializer : public Serializer
{
public:
XmlSerializer(){
m_string_ser="XML";
}
string getSerializer(){
return m_string_ser;
}
};
class JsonSerializer : public Serializer
{
public:
JsonSerializer(){
cout << "JsonSerializer " << endl;
m_string_ser="JSON";
}
string getSerializer(){
cout << "getSerializer" << endl;
cout << m_string_ser << endl;
return m_string_ser;
}
};
class Connect
{
public:
string comm_protocol;
string m_string_ser;
void show(){
cout << "show" << endl;
cout << "support " << comm_protocol << "--" << m_string_ser << endl;
}
};
class TCPConn : public Connect
{
public:
TCPConn(Serializer* S){
cout << "TCPConn1 " << endl;
comm_protocol = "TCP";
cout << "TCPConn2 " << endl;
m_serializer = S;
cout << "TCPConn3 " << endl;
m_string_ser = m_serializer->getSerializer();
cout << "m_string_ser " << m_string_ser << endl;
}
private:
Serializer* m_serializer;
};
class HTTPConn : public Connect
{
public:
HTTPConn(Serializer* Ser){
comm_protocol = "HTTP";
m_serializer = Ser;
m_string_ser = m_serializer->getSerializer();
}
private:
Serializer* m_serializer;
};
int main()
{
TCPConn* CTCPConn = new TCPConn(new JsonSerializer());
CTCPConn->show();
delete CTCPConn;
HTTPConn* CHTTPConn = new HTTPConn(new XmlSerializer());
CHTTPConn->show();
delete CHTTPConn;
return 0;
}
总结
- 桥接模式实现了抽象化和实现化的解耦,相互独立不会影响到对方;
- 对于两个独立变化的维度,适合桥接模式的使用;
- 分离抽象接口及其实现部分。提出了比继承更好的解决方案