UML类图(仅供参考)如下:
桥接模式解决的问题:
抽象类之间为聚合关系,将抽象部分与实现部分分离,使它们都可以独立的变化,这样他们的子类就可以任意聚合在一起
源码
#include <iostream>
// 抽象类,桥的一部分
class CAbstractionImplement
{
public:
virtual ~CAbstractionImplement() {}
// 定义接口,表示该类所支持的操作
virtual void Operation() = 0;
protected:
CAbstractionImplement() {}
};
// 具体实现A
class CConcreteAbstractionImplementA :public CAbstractionImplement
{
public:
virtual void Operation()
{
std::cout << "CConcreteAbstractionImplementA::Operation" << std::endl;
}
};
// 具体实现B
class CConcreteAbstractionImplementB :public CAbstractionImplement
{
public:
virtual void Operation()
{
std::cout << "CConcreteAbstractionImplementB::Operation" << std::endl;
}
};
// 抽象类,桥的另一部分
class CAbstraction
{
public:
virtual ~CAbstraction() {}
// 定义接口,表示该类所支持的操作
virtual void Operation() = 0;
protected:
CAbstraction(CAbstractionImplement* imp) :_imp(imp) {}
// CAbstraction与CAbstractionImplement为聚合
// 这样他们的子类可以以任何方式组合,从而实现桥接模式
CAbstractionImplement *_imp;
};
// 具体实现A
class CRefinedAbstractionA :public CAbstraction
{
public:
CRefinedAbstractionA(CAbstractionImplement* imp) :CAbstraction(imp) {}
virtual void Operation()
{
std::cout << "CRefinedAbstractionA::Operation" << std::endl;
this->_imp->Operation();
}
};
// 具体实现A
class CRefinedAbstractionB :public CAbstraction
{
public:
CRefinedAbstractionB(CAbstractionImplement* imp) :CAbstraction(imp) {}
virtual void Operation()
{
std::cout << "CRefinedAbstractionB::Operation" << std::endl;
this->_imp->Operation();
}
};
// 测试
int main()
{
CAbstractionImplement* imp = new CConcreteAbstractionImplementA();
CAbstraction* abs = new CRefinedAbstractionA(imp);
abs->Operation();
std::cout << "-----------------------------------------" << std::endl;
CAbstractionImplement* imp1 = new CConcreteAbstractionImplementB();
CAbstraction* abs1 = new CRefinedAbstractionA(imp1);
abs1->Operation();
std::cout << "-----------------------------------------" << std::endl;
CAbstractionImplement* imp2 = new CConcreteAbstractionImplementA();
CAbstraction* abs2 = new CRefinedAbstractionB(imp2);
abs2->Operation();
std::cout << "-----------------------------------------" << std::endl;
CAbstractionImplement* imp3 = new CConcreteAbstractionImplementB();
CAbstraction* abs3 = new CRefinedAbstractionB(imp3);
abs3->Operation();
}
好处
1、抽象和实现的分离。
2、优秀的扩展能力。
3、实现细节对客户透明