模式动机:当某个接口可能有多种实现方式时,一般会使用继承来解决。但是继承总是体现出与具体的平台相关,无法很好地进行扩充,此时需要将接口与实现类最大可能地解耦,使其二者都可以独立发展而不受影响,增大系统的灵活性。
模式定义(Bridge Pattern):将抽象接口与具体实现分离开来,使得两部分都可以独立变化而不受影响。
模式结构图:
模式代码:
bt_桥接模式.h:
#ifndef BP_H
#define BP_H
#include <iostream>
using namespace std;
/*
具体操作接口
*/
class Implementor
{
public:
virtual ~Implementor(){ }
virtual void operationImpl() = 0;
};
class ConcreteImplementorA : public Implementor
{
public:
virtual void operationImpl()
{
cout << "调用A类具体实现方法" << endl;
}
};
class ConcreteImplementorB : public Implementor
{
public:
virtual void operationImpl()
{
cout << "调用B类具体实现方法" << endl;
}
};
/*
抽象功能接口
*/
class Abstraction
{
public:
virtual ~Abstraction(){ }
virtual void operation() = 0;
virtual void setImpl(Implementor* impl) = 0;
protected:
Implementor* impl;
};
class RefinedAbstraction : public Abstraction
{
public:
virtual void setImpl(Implementor* impl)
{
this->impl = impl;
}
virtual void operation()
{
impl->operationImpl();
}
};
#endif // BP_H
测试用例.cpp:
#include "bt_桥接模式.h"
int main()
{
cout << "***** 桥接模式测试 *****" << endl;
Implementor* pI = new ConcreteImplementorA;
Abstraction* pA = new RefinedAbstraction;
pA->setImpl(pI);
pA->operation();
return 0;
}
式分析:桥接模式的优点主要包含如下三部分:
1> 分离接口及其实现:抽象类的具体实现部分可以延迟到运行时进行配置,一个对象即使在运行时也能改变其实现部分。同时客户只需知道Abstraction和Implementor接口即可,无需了解其他类的细节。
2> 可扩展性增强:可以独立地对Abstraction和Implementor层次结构进行扩充,二者是相互独立的,耦合性比较小。
3> 实现细节对于客户透明。