桥接(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. Unity 各个组件参数总结

    今天在蛮牛教育上学习了NGUI的课程下面给大家总结了一些小知识点希望对大家有帮助UICamera-可以添加到任何相机,包含事件系统.UICamera是每个UI的重要组成部分.它负责发送Camera中所 ...

  2. Chrome Adobe Flash Player 因过期而 阻止

    百度搜索重装不管用 作者:胡中元链接:https://www.zhihu.com/question/32223811/answer/60456561来源:知乎著作权归作者所有.商业转载请联系作者获得授 ...

  3. 正则表达式awk

    以冒号: 为分隔符打印出来:打印第一段$1:  -F 分隔符 [root@localhost awk]# awk -F ':' '{print $1}' test.txt root bin daemo ...

  4. Macbook pro安装MacOS系统

    在app store 下载系统sierra; 打开磁盘工具,选择优盘,抹掉: 日志式,GUID分区: http://www.cnblogs.com/xiaobo-Linux/ 终端输入命令, sudo ...

  5. Redis锁的简单应用

    本文版权归博客园和作者本人吴双共同所有 .转载爬虫请注明地址,博客园蜗牛 http://www.cnblogs.com/tdws/p/5712835.html 蜗牛Redis系列文章目录http:// ...

  6. CentOS 65 java 访问 MS SQL

    #install unixODBC sudo yum install unixODBC unixODBC-devel -y #install freetds #1st download freetds ...

  7. 2015-10-07:几乎100%肯定:百度网盘在夜间的时段是不限速的:早晨7点前很轻松达到3M/S,7点后就降低到1M/S了,白天才400K/S左右

    最近发现(2015-10-07)几乎100%肯定:百度网盘在夜间的时段是不限速的:早晨7点前很轻松达到3M/S,7点后就降低到1M/S了,白天才400K/S左右

  8. c# windows服务

    参考:https://www.cnblogs.com/knowledgesea/p/3616127.html 序言 前段时间做一个数据迁移项目,刚开始用B/S架构做的项目,但B/S要寄存在IIs中,而 ...

  9. js中===与==区别

    本文出自:http://www.cnblogs.com/yiki/archive/2012/05/08/2489687.html 1.对于string,number等基础类型,==和===是有区别的 ...

  10. 苹果官方xcodeprojectbuild设置指南

    https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/ ...