1、出现原因

1、同一个类型,有两个变化的维度(两个维度的抽象:一个抽象部分的抽象,一个实现部分的抽象)

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

2、具体的例子

数据库操作

操作类型:增删改查  (具体功能的实现部分)

操作对象:客户,订单,产品…(对应上面的增删改查是 1对多的关系(通过聚合关系联系起来))

手机软件

软件功能:通讯录,游戏

支持品牌:M(摩托骡拉),N(喏鸡呀)

计算机软件

软件功能:游戏,开发工具,绘图软件…

运行平台:Windows,Unix….

过度的使用继承:

——以手机软件为例:

以手机品牌分类:

以手机软件分类:

我们仔细观察,如果给上面的增加一个手机软件,,那么每个手机品牌都要增加这个手机软件,都要变化,耦合度太高了。

使用桥接模式重构上面的:

3、意图:

抽象部分实现部分分离,使它们都可以独立地变化

4、结构图:

5、代码演示

 Birdge模式

客户端代码:

 1             //创建抽象
2 PhoneBrand samsung = new Samsung();
3 //创建实现
4 IPhoneSoftware soft1 = new QQ();
5 IPhoneSoftware soft2 = new KuGou();
6 //将抽象和实现相结合
7 samsung.Instance(soft1);
8 samsung.Instance(soft2);
9
10 samsung.StareAllSoftware();

6、实现要点

1、Abstraction(抽象部分):定义抽象类的接口;;并维护指向Implementor类(实现部分)的对象指针。(抽象部分变化不会影响到实现部分,实现部分变化不会影响到抽象部分,因为他们是通过 聚合关系 连接起来的,扩展只是对他们各自的抽象 进行扩展变化)

2、Implementor:定义实现类的接口,该接口不一定要与Abstraction的接口完全一致。事实上这两个接口可以完全不同。(因为是对 各自方面的抽象(是两个不同的维度),通过 聚合关系 联系起来)

3、一般而言,Implementor接口仅提供基本操作实现部分的具体功能),而Abstraction(是对 具体实现的 调用)则定义了基于操作的较高层次的操作

7、效果

1、将接口(抽象)与实现分离:一个接口可以有若干实现(聚合关系),一个实现也可以为若干对象服务(一个实现的部分的具体功能 可以进行 复用,,可以多个对象(抽象下面具体的 扩展的抽象)里面进行使用),表示逻辑的对象可以动态地实现功能的对象组合

2、提高可扩充性逻辑和实现都可以通过类层次的扩展进行扩充。

3、逻辑和实现被封装在不同的对象中,逻辑对实现的引用动态进行的。在实际中,需要分别用不同的“工厂”创建逻辑和实现,然后组装。

8、适用性

1、不希望在业务(抽象部分)和业务的软件(实现部分)实现之间存在固定的绑定关系。例如,不希望“入库”业务过程和具体的数据库访问技术或数据库管理系统有过于密切的关系。

2、希望类的抽象和实现部分可以扩充,进而实现不同的抽象接口和实现部分的组合。(实现部分可以在不同的抽象部分 可以被复用)

修改实现部分对用户不产生影响,即代码无须重新编译。(因为用户操作的是实现的接口,具体的实现接口下面的实现部分已经封装起来了)

3、复用实现部分。由于实现部分所处的层次较低,因此可以被多种业务模块复用。例如,数据库访问模块可以用在多种业务单元中。

9、总结

1、Bridge模式使用“对象间的组合关系”解耦抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化

2、所谓抽象和实现沿着各自维度的变化,即“子类化”它们。得到各个子类之后,便可以任意组合它们

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

4、Bridge模式的应用一般在“两个非常强的变化维度”(含有两个方向可以进行派生),有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式设计模式是一种思想,并不一定要硬套)。

 
 
分类: 设计模式

Birdge(桥接)模式的更多相关文章

  1. BridgePattern(桥接模式)

    /** * 桥接模式 * @author TMAC-J * 应用于多维度方案 * 用组合的形式代替继承 * 符合单一职责原则 * 一个类只有一个引起他变化的原因 * 增加程序灵活性 */ public ...

  2. PHP设计模式(八)桥接模式(Bridge For PHP)

    一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 二.案例 1.模拟毛笔(转) 需求:现在需要准备三种粗细(大中小),并且有五种颜色的比 如果使用蜡 ...

  3. 设计模式(八)桥接模式(Bridge Pattern)

    一.引言 这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视 ...

  4. 设计模式--桥接模式Bridge(结构型)

    一.概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或者多个维度的变化,如何应对这种"多维度的变化",就可以利用桥接模式. 引例: 设想如果要绘制矩形.圆形.椭圆.正方形,我 ...

  5. vmware中虚拟机与主机ping不通,桥接模式,IP地址在同一网段,无法互ping!

    现象描述:网卡选用的桥接模式,IP地址在同一个网段,虚拟机内部可以正常上网,但是Guest OS和Host OS无法互ping! 原因:虚拟机里的防火墙没有关闭,导致禁用ping功能. 解决方法:关闭 ...

  6. 桥接模式/bridge模式/对象结构型

    意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 动机 当一个抽象类有多个实现时,通常用继承来协调它们.但是继承机制将抽象和实现固定,难以对抽象部分和实现部分独立地进行修改.扩充和重用. ...

  7. Objective-C 桥接模式 -- 简单实用和说明

    桥接模式---把两个相关联的类抽象出来, 以达到解耦的目的 比如XBox遥控器跟XBox主机, 我们抽象出主机和遥控器两个抽象类, 让这两个抽象类耦合 然后生成这两个抽象类的实例XBox & ...

  8. C#设计模式-桥接模式

    这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控 ...

  9. C#设计模式系列:桥接模式(Bridge)

    1.桥接模式简介 1.1>.定义 当一个抽象可能有多个实现时,通常用继承来进行协调.抽象类定义对该抽象的接口,而具体的子类则用不同的方式加以实现.继承机制将抽象部分与它的实现部分固定在一起,使得 ...

  10. 《JS设计模式笔记》 4,桥接模式

    //桥接模式的作用在于将实现部分和抽象部分分离开来,以便两者可以独立的变化. var singleton=function(fn){ var result; return function(){ re ...

随机推荐

  1. 一步一步的理解C++STL迭代器

    一步一步的理解C++STL迭代器 "指针"对全部C/C++的程序猿来说,一点都不陌生. 在接触到C语言中的malloc函数和C++中的new函数后.我们也知道这两个函数返回的都是一 ...

  2. windows server 2008见安装IIS方法(解决)

    windows server 2008见安装IIS方法(解决) 刚开始有点蒙,后来才知道原来如此.! . 右键点击[我的电脑]--[管理]--[字符]--[加入角色]--仅落后win7像.啊! 版权声 ...

  3. MOCK.JS 生成随机数据,拦截 Ajax 请求

    mock.js 的用处 前后端分离 :让前端攻城师独立于后端进行开发. 增加单元测试的真实性 :通过随机数据,模拟各种场景. 开发无侵入 :不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响 ...

  4. JMeter怎么使用代理服务器

    一.JMeter有一个内置的代理服务器,主要用户使用浏览器录制脚本,在左侧的WorkBench中添加HTTP Proxy Server即可, 其中port表示代理服务器段口号, URL Pattern ...

  5. Xcode-5.1.1更改文件盯作者

    原来的文件默认是用户开机时的username ,网上说什么改通讯录事实上都是不正确的. 1.首先打开偏好设置,选择用户群组 2.进入用户界面 改动全名.此时要求你输入用户的password才干改动us ...

  6. 应用程序框架实战十三:DDD分层架构之我见(转)

    前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构 ...

  7. 苹果公司的新的编程语言 Swift 高级语言()两--基本数据类型

    一  .   常量和变量 Swift语言 对常量和变量的声明进行了明白的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明白. 常量和变量的差别是常量在设置或初始化后 ...

  8. WP 前台或后台显示ShellToast

    原文:WP 前台或后台显示ShellToast using Microsoft.Phone.Shell; ShellToast toast = new ShellToast(); toast.Titl ...

  9. Matlab曲面拟合和插值

    插值和拟合都是数据优化的一种方法,当实验数据不够多时常常须要用到这样的方法来绘图. 在matlab中都有特定的函数来完毕这些功能. 这两种方法的确别在于: 当測量值是准确的,没有误差时,一般用插值: ...

  10. P31RestKit.dll 2.0 Unity3d json

    using System.Collections.Generic; using UnityEngine; using System.Collections; using Prime31; public ...