结构型 桥接模式

桥接模式/接口模式(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值