结构型 桥接模式

简介: 结构型 桥接模式

桥接模式/接口模式(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;
}
目录
相关文章
|
缓存 资源调度 区块链
Electron打包图标不显示解决方案
Electron打包图标不显示解决方案
2264 0
|
11月前
|
机器学习/深度学习 API
机器学习入门(七):线性回归原理,损失函数和正规方程
机器学习入门(七):线性回归原理,损失函数和正规方程
|
10月前
|
存储 数据可视化 网络协议
什么是ELK栈?如何与Spring Boot一起使用?
什么是ELK栈?如何与Spring Boot一起使用?
378 0
|
Android开发
Android 支持TP触摸唤醒
Android 支持TP触摸唤醒
232 0
|
11月前
|
SQL 存储 数据库
实验4:SQL视图操作技巧与方法
在数据库管理系统中,视图(View)是一种虚拟表,它基于SQL查询的结果集创建,并不实际存储数据
|
存储 分布式计算 监控
Spark Standalone模式是一种集群部署方式
【6月更文挑战第17天】Spark Standalone模式是一种集群部署方式
204 7
|
前端开发 iOS开发
input框设置placeholder属性在iOS中显示不完整
input框设置placeholder属性在iOS中显示不完整
177 1
|
Web App开发
部署WebRTC音视频会议服务需要以下服务器和带宽配置
部署WebRTC音视频会议服务需要以下服务器和带宽配置
615 3
|
开发工具 git
git cherry-pick的使用
git cherry-pick的使用
459 0
|
存储
编码集的作用是什么?说出几个常见的编码集?为什么常用utf-8?
编码集的作用是什么?说出几个常见的编码集?为什么常用utf-8?
217 0