动机(Motivation)

  • 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度(功能类),乃至多个纬度的变化。

  • 如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?

模式定义

将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。 ——《设计模式》GoF

要点总结

  • Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自纬度的变化,即“子类化”它们。

  • Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。

  • Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类也有多于两个的变化维度,这时可以使用Bridge的扩展模式。

个人总结

  • 桥接模式使两个功能类为组合关系,这样在实际使用过程中A就可以根据情况来动态调用B的具体功能。这就像桥一样,使两者相互联系起来。

  • 业务功能个数为m,平台功能个数为n,则单纯的继承的总个数为m + m*n,使用桥接模式后的总个数为m+n。

#include <iostream>
using namespace std;class IRabbitColor
{
public:virtual void doSomething() = 0;
};class IRabbit
{
public:virtual ~IRabbit() {delete m_color;m_color = nullptr;};virtual void show() = 0;void setColor(IRabbitColor *color){m_color = color;}
protected:IRabbitColor *m_color;//桥梁的作用,多态调用
};class BigRabbit : public IRabbit
{
public:~BigRabbit(){};virtual void show(){cout << "Big Rabbit" << endl;m_color->doSomething();};
};class MiddleRabbit : public IRabbit
{
public:~MiddleRabbit(){};virtual void show(){cout << "Middle Rabbit" << endl;m_color->doSomething();};
};
class SmallRabbit : public IRabbit
{
public:~SmallRabbit(){};virtual void show(){cout << "Small Rabbit" << endl;m_color->doSomething();};
};class White : public IRabbitColor
{
public:virtual void doSomething(){cout << "color is white" << endl;};
};class Black : public IRabbitColor
{
public:virtual void doSomething(){cout << "color is black" << endl;};
};class Gray : public IRabbitColor
{
public:virtual void doSomething(){cout << "color is gary" << endl;};
};int main()
{IRabbit *big_rabbit = new BigRabbit;big_rabbit->setColor(new White);big_rabbit->show();IRabbit *mid_rabbit = new MiddleRabbit;mid_rabbit->setColor(new Black);mid_rabbit->show();delete big_rabbit;delete mid_rabbit;big_rabbit = nullptr;mid_rabbit= nullptr;return 0;
}

如果不用桥接模式的话,则大白兔、大黑兔、大灰兔、中白兔。。。小灰兔等九个都需要写出来。这个明显是不好的,违背了依赖倒置原则。

C++设计模式(10)——桥模式相关推荐

  1. 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

    如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...

  2. 设计模式——Bridge 桥模式

    文章目录 1.动机 2.定义 3.代码 4.总结 1.动机 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化. 如何应对这种"多维度的变化"? 如何利用 ...

  3. java bridge 模式_Java设计模式之桥模式(Bridge模式)介绍

    Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...

  4. 设计模式(10)-----模板方法模式

    模板方法模式(Template Method) 定义 定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. UML类图 例子 ...

  5. JavaScript设计模式-10.工厂模式实例xhr

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 < ...

  6. 设计模式10——flyweight模式

    用例: //flyweight.cpp //享元模式:运用共享技术有效地支持大量细粒度对象. #include "gtest/gtest.h" #include <map&g ...

  7. 组合模式_[设计模式]10.组合模式

    组合模式,也叫"部分整体模式",它把相似的对象组合成树形结构的一个整体.于是,只需一个代表,我们就能继续访问与之相关的同族对象. 模式卡片 模式UML图 七个例子 部门里人很多,大 ...

  8. JS设计模式——10.门面模式

    门面模式 这是一种组织性的模式,它可以用来修改类和对象的接口,使其更便于使用.它可以让程序员过得更轻松,使他们的代码变得更容易管理. 门面模式有两个作用: 简化类的接口 消除与使用她的客户代码之间的耦 ...

  9. 设计模式(10)——策略模式

    策略模式 一. 概述 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户端. 二. 模式解读 2.1 策略模式的一般化类图 2.2 模式中的角色 2.1 ...

  10. 设计模式(10)----策略模式

    策略模式 一. 概述 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户端. 二. 模式解读 2.1 策略模式的一般化类图 2.2 模式中的角色 2.1 ...

最新文章

  1. c++监听键盘_你会为颜值买单吗?杜伽fusion复古键盘晒单体验_键盘
  2. 学习SQLSERVER2005高可用性数据库镜像的一些心得
  3. 如何为SAP OData消费维护不同的ABAP后端系统
  4. 三招快速重新打开被关闭的Chrome标签页
  5. linux生成不能访问的文件夹,Linux ln创建软连接之后无法使用,无法whereis
  6. 前端flv.js设置缓冲时间和大小_好程序员web前端细解cookie那些事
  7. hdu1166------树状数组(板子)
  8. 客户信息管理系统(java)
  9. WORD程序失去焦点再获得焦点后无法使用鼠标功能的解决办法(已解决)
  10. DFROBOT Mind+ 掌控板 人工智能测温实验
  11. Ever-Flowers IN Never-Dream(16)
  12. 《石头迷阵》游戏业务数据设计、游戏功能制作、游戏界面绘制
  13. html在线表单生成,html在线编辑表格
  14. ddr2是几代内存_如何区分DDR1 DDR2 DDR3内存条
  15. 虎年起点:两个100万
  16. 独立站卖家如何利用Google广告做好站外引流?
  17. Bugku新平台论剑场writeup
  18. 【C/C++】排序讲解,C语言实现各种排序
  19. 数据库如何加锁?锁是用来干嘛的?(转载)
  20. Bootstrap样式插件/响应式布局/旅游网案例

热门文章

  1. 已超越 RHEL!Rocky Linux 牛逼
  2. inside Android完整版,INSIDE安卓版
  3. [Buzz.Today]“估摸”手机:Google收购摩托罗拉
  4. jquery-form.js 兼容IE8 IE9等以上火狐谷歌等浏览器
  5. SSL P2293 暗黑游戏
  6. 农产品批发采购APP开发 手机里的农产品市场
  7. 转慎重推荐十个优秀的网络硬盘(网盘)
  8. 天空卫士C++ 一面(技术面、61min)
  9. Redux-saga快速解读
  10. python进阶版《植物大战僵尸》