桥接(Bridge)模式,又称Handle/Body模式,属于对象结构型模式。用于将抽象部分与它的实现部分分离,使它们都可以独立地变化。比如常见的电脑窗口界面,不同的操作系统其窗口界面绘制的原理肯定不一样。这里,窗口界面就相当于抽象部分(Abstraction),而窗口界面本身也可以随着功能的不同而进行扩充,扩充的窗口就是抽象窗口的扩充抽象类(RefinedAbstraction),这些抽象需要具体的操作系统实现才能被我们看到,那基于操作系统的窗口实现就是实现部分(Implementor),不管是Window,Linux还是Mac。Window,Linux或Mac则是实现接口的具体实现类(ConcreteImplementor)。

一、使用场景

1、如果一个系统需要在抽象和具体之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,那么可以通过桥接模式使它们在抽象层之上建立一个关联关系,从而增加灵活性。
2、“抽象部分”和“实现部分”可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
3、一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
4、对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

二、UML图

三、Java实现

package study.patterns.bridge;
/**
* 桥接模式:通过将维度解耦来处理多维度的变化。
* @author qbg
*/
public class BridgePattern {
public static void main(String[] args) {
/**
* 对于客户端而言,可以针对两个维度的抽象层编程,在程序运行时再动态确定两个维度的子类,
* 动态组合对象,将两个独立变化的维度完全解耦,以便能够灵活地扩充任一维度而对另一维度不造成任何影响。
*/
Brush brush = new LargeImpl();
BrushImpl impl = new RedImpl();
brush.setBrushImpl(impl);
brush.drawPicture("蒙娜丽莎的微笑");
}
}
/**
* 辅助类:画
*/
class Picture{}
/**
* 画笔的抽象基类:变化维度有种类,型号,颜色等,
* 此处拿型号(大,中,小)和颜色(红,绿,蓝)做示例维度.
* 型号为抽象维度,颜色为实现维度.
* 如果需要添加新型号的画笔,只需扩充抽象类Brush;
* 如果需要添加新的画笔颜色,只需增加BrushImpl接口的具体实现类.
*/
abstract class Brush{
protected BrushImpl impl; public void setBrushImpl(BrushImpl impl){
this.impl = impl;
}
/**
* 抽象部分的业务方法:画画
*/
public abstract void drawPicture(String name);
}
/**
* 抽象画笔颜色实现类:实现类接口
*/
interface BrushImpl{
public void doDraw(Picture pic); //涂抹相应的颜色
}
/**
* 红色画笔实现类:具体实现类
*/
class RedImpl implements BrushImpl{
@Override
public void doDraw(Picture pic) {
System.out.println("涂抹红色。。。。");
}
}
/**
* 绿色画笔实现类:具体实现类
*/
class GreenImpl implements BrushImpl{
@Override
public void doDraw(Picture pic) {
System.out.println("涂抹绿色 。。。。");
}
}
/**
* 蓝色画笔实现类: 具体实现类
*/
class BlueImpl implements BrushImpl{
@Override
public void doDraw(Picture pic) {
System.out.println("涂抹蓝色 。。。。");
}
} /**
* 大号画笔:扩充抽象类
*/
class LargeImpl extends Brush{
@Override
public void drawPicture(String name) {
//模拟使用画笔勾勒画的线条
Picture pic = new Picture();
impl.doDraw(pic);
System.out.println(name+",使用大号画笔绘制。。。");
}
}
/**
* 中号画笔:扩充抽象类
*/
class MediumImpl extends Brush{
@Override
public void drawPicture(String name) {
//模拟使用画笔勾勒画的线条
Picture pic = new Picture();
impl.doDraw(pic);
System.out.println(name+",使用中号画笔绘制。。。");
}
}
/**
* 小号画笔:扩充抽象类
*/
class TinyImpl extends Brush{
@Override
public void drawPicture(String name) {
//模拟使用画笔勾勒画的线条
Picture pic = new Picture();
impl.doDraw(pic);
System.out.println(name+",使用小号画笔绘制。。。");
}
}

四、模式优缺点

优点:

1、分离抽象接口及其实现部分。桥接模式使用“对象间的关联关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自维度的变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。
2、在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法,它极大减少了子类的个数。
3、桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合“开闭原则”。

缺点:

1、桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。
2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累。

PS:上面的总结参考自livelion,经验尚浅,只能仰仗大神!

设计模式初探-桥接(Bridge)模式的更多相关文章

  1. Java 实现桥接(Bridge)模式

    类图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamp3d21scDQ1Ng==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  2. 设计模式C++描述----09.桥接(Bridge)模式

    一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...

  3. Java设计模式---桥接Bridge模式

    参考于 : 大话设计模式 马士兵设计模式视频 写在开头: 桥接模式主要用于一件事物分成了两个维度,进行排列组合,比如礼物,可以分成优雅的礼物(抽象),花(具体),排列组合优雅的花! 1.为什么使用桥接 ...

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

    1.概述: 桥接模式:把抽象和行为分离开来,中间需要某个介质来连接抽象化和行为化.此模式的概述听起来非常像适配器模式,不要搞混了,虽然都是借用中间介质,但意义不同.最典型的桥接模式就是:JDBC.通过 ...

  5. 漫谈设计模式(三):桥接(Bridge)模式 —— 将类功能、结构两层次分离

    1.前言 类主要有两个层次,一个是功能层次,另一个是实现层次. 功能层次,一般应用于当前类不能满足多样化的业务需求,让子类去继承(具体)父类,添加加一些父类中没有的功能(一般是增加新的方法),这就属于 ...

  6. 桥接(Bridge)模式

    桥接模式又称为柄体模式或接口模式.桥接模式的用意就是"将抽象化与实现化解耦,使得二者可以独立变化". 抽象化: 存在于多个实体中的共同的概念性联系,就是抽象化.作为一个过程,抽象化 ...

  7. JAVA设计模式初探之组合模式

    先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性.” 就拿剪发办卡的事情来分析一下吧. 首先,一张卡可以在总部,分店, ...

  8. [设计模式] 7 桥接模式 bridge

    #include<iostream> using namespace std; class AbstractionImp { public: virtual ~AbstractionImp ...

  9. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...

随机推荐

  1. Python——signal

    该模块为在Python中使用信号处理句柄提供支持.下面是一些使用信号和他们的句柄时需要注意的事项: 除了信号 SIGCHLD 的句柄遵从底层的实现外,专门针对一个信号的句柄一旦设置,除非被明确地重置, ...

  2. Tomcat的Admin和Manager工具初探

    版本说明 apache-tomcat-5.5.28.zip(解压缩版) Manager工具是自带的,Admin工具apache-tomcat-5.5.28-admin.zip需要单独安装 下载地址:h ...

  3. LigerUI可编辑表格左下角出现白色小方块遮罩层问题解决办法

    LigerUI已经研究了一段时间,总体感觉还不错,基于jQuery开发,框架提供了丰富的UI组件,尤其LigerUI表格,功能还是挺强大的 在使用LigerUI可编辑表格的时候,发现一个小小的问题 当 ...

  4. MAC算法

    MAC算法 (Message Authentication Codes) 带秘密密钥的Hash函数:消息的散列值由只有通信双方知道的秘密密钥K来控制.此时Hash值称作MAC. 原理:在md与sha系 ...

  5. CentOS6.5下安装iRedMail中需要解决的问题

    iRedMail是个专门用于Redhat/CentOS下的企业Mail服务集成安装软件包,本来只要有干净的系统就可以轻松安装,无奈国内网络状况和墙头众多,安装中也有很多问题需要解决,下面记录的都是我安 ...

  6. Redis面试题及答案整理

    1.什么是Redis?简述它的优缺点? Redis的全称是:Remote Dictionary.Server,本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载 ...

  7. MyEclipse使用笔记

    简单记录下个人常用的一些MyEclipse设置 VS颜色方案 Window-->Preference-->Java->Editor-->Syntax Coloring Clas ...

  8. android project 文件夹

    android多国语言文件夹 http://www.blogjava.net/zhaojianhua/archive/2012/02/09/369676.html Android平板开发精确适配不同的 ...

  9. 提高OCR质量的技巧之区域未正确检测

    ABBYY FineReader会在识别前分析页面图像并检测图片上不同类型的区域,如文本.图片.背景图片.表格和条形码区域,此分析确定识别的区域和识别顺序.在用户界面中,不同的区域类型按其边界的颜色进 ...

  10. 让Zend Studio联系关系CakePHP模板文件.ctp

    让Zend Studio关联CakePHP模板文件.ctp Zend Studio是套强大的PHP编辑器,各种给力让PHP开发者爱不释手.对于CakePHP程序员来说,有件事情相当头疼,在初始安装好Z ...