桥接模式/接口模式(Bridge Pattern):将抽象部分与实现部分分离,使它们都可以独立的变化。 提供桥接的接口,使两者可以独立变化却互不影响(可以与继承配合,实现各种不同的组合)
桥接模式
适用场景:
跨平台应用、 支持多种类型的数据库服务器,与多个特定种类 (例如云平台和社交网络等) 的 API 供应商协作时。
硬件与软件操作系统的适配
源码Demo:
如:要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,我们可以设计根据需要自己组合,这时就可以用到桥接模式。
1:A平台有一套构建形状对象(颜色,形状类型属性)的接口。
2:B平台有一套构建形状对象(颜色,形状类型属性)的接口。
3:用一个桥接类,继承的方式实现不同的平台接口的封装。
#include <iostream>
#include <string.h>
using namespace std;
/***************************
为了适配不同的接口,做中间封装类
样例分析:
定义一个基础桥接类,不同类型接口的封装,用不同的子类去构建。
1:A平台有一套构建形状对象(颜色,形状类型属性)的接口。
2:B平台有一套构建形状对象(颜色,形状类型属性)的接口。
3:用一个桥接类,继承的方式实现不同的平台接口的封装。
扩展:
可以扩展跨平台接口的管理
可以扩展不同数据库接口的管理
***************************/
//假设有两个平台有两套接口 A平台 和B平台
class AplatfromInterface{
public:
AplatfromInterface():m_shape(""), m_color("") {}
~AplatfromInterface() {}
void setShapeA(string &shape)
{
m_shape = shape;
}
void setColorA(string &color)
{
m_color = color;
}
string & getShapeA()
{
return m_shape;
}
string & getColorA()
{
return m_color;
}
private:
string m_shape;
string m_color;
};
class BplatfromInterface{
public:
BplatfromInterface():m_shape(""), m_color("") {}
~BplatfromInterface() {}
void setShapeB(string &shape)
{
m_shape = shape;
}
void setColorB(string &color)
{
m_color = color;
}
string & getShapeB()
{
return m_shape;
}
string & getColorB()
{
return m_color;
}
private:
string m_shape;
string m_color;
};
//定义一个桥接基础类,生成目标对象
class Shape{
//创建一个shape形状的具体对象,子类是真正的实现
public:
virtual void CreateShape() = 0; //可以传入入参按需构造
virtual void PrintShape() = 0 ;
virtual ~Shape() {}
};
//A平台上形状类接口的封装 调用a平台上的类对象的接口
class AplatfromShape: public Shape{
public:
AplatfromShape() {
m_a = new AplatfromInterface();
}
~AplatfromShape() {
if(m_a != nullptr)
{
delete m_a;
m_a = nullptr;
}
}
void CreateShape() override
{
string shape = "ashape";
string color = "acolor";
m_a->setShapeA(shape);
m_a->setColorA(color);
}
void PrintShape() override
{
cout<<"platfrom:"<<m_a->getShapeA() <<" "<<m_a->getColorA()<<endl;
}
private:
AplatfromInterface* m_a;
};
//B平台上形状类接口的封装 调用B平台上的类对象的接口
class BplatfromShape: public Shape{
public:
BplatfromShape() {
m_b = new BplatfromInterface();
}
~BplatfromShape() {
if(m_b != nullptr)
{
delete m_b;
m_b = nullptr;
}
}
void CreateShape() override
{
string shape = "bshape";
string color = "bcolor";
m_b->setShapeB(shape);
m_b->setColorB(color);
}
void PrintShape() override
{
cout<<"platfrom:"<<m_b->getShapeB() <<" "<<m_b->getColorB()<<endl;
}
private:
BplatfromInterface* m_b;
};
int main()
{
//使用的时候,不必过多关注接口 根据不同的平台,初始化稍微差异,其他不变
//如果在A平台 这样用:
Shape * a_platfrom = new AplatfromShape();
a_platfrom->CreateShape();
a_platfrom->PrintShape();
delete a_platfrom;
a_platfrom = nullptr;
//b 平台可以这样用
Shape * b_platfrom = new BplatfromShape();
b_platfrom->CreateShape();
b_platfrom->PrintShape();
delete b_platfrom;
b_platfrom = nullptr;
return 0;
}