1.意图

将抽象部分与它的实现部分分离。使他们都能够独立地变化。

2.别名

Handle/Body

3.动机

当一个抽象对象可能有多个实现时,通经常使用继承来协调它们。抽象类定义对该抽象的接口。而详细的子类则用不同方式加以实现。可是此方法有时不够灵活。

继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立的进行改动、扩充和重用。

4.适用性

下面情况使用Bridge模式:

  • 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。

    比如这样的情况可能是由于,在程序执行时刻实现部分应能够被选择或者切换。

  • 类的抽象以及它的实现都应该能够通过生成子类的方式加以扩充。

    这时Bridge模式使你能够对不同的抽象接口和实现部分进行组合,并分别对他们进行扩充。

  • 对一个抽象的实现部分的改动应对客户不产生影响,即客户的代码不必又一次编译。
  • (c++)你想对客户全然隐藏抽象的实现部分。

    在C++中。类的表示在类接口中是可见的。

  • 你想在多个对象间共享实现(可能使用引用计数),单同事要求客户并不知道这一点。

5.结构

桥接模式就是把事物和其详细实现分开。使他们能够各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者能够独立变化,像我们经常使用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候。在各个数据库之间进行切换。基本不须要动太多的代码。甚至丝毫不用动。原因就是JDBC提供统一接口。每一个数据库提供各自的实现。用一个叫做数据库驱动的程序来桥接即可了。我们来看看关系图:

6.代码演示样例

实现代码:

先定义接口:

public interface Sourceable {
public void method();
}

分别定义两个实现类:

public class SourceSub1 implements Sourceable {

    @Override
public void method() {
System.out.println("this is the first sub!");
}
} public class SourceSub2 implements Sourceable { @Override
public void method() {
System.out.println("this is the second sub!");
}
}

定义一个桥。持有Sourceable的一个实例:

public abstract class Bridge {
private Sourceable source; public void method(){
source.method();
} public Sourceable getSource() {
return source;
} public void setSource(Sourceable source) {
this.source = source;
}
} public class MyBridge extends Bridge {
public void method(){
getSource().method();
}
}

測试类:

public class BridgeTest {

    public static void main(String[] args) {

        Bridge bridge = new MyBridge();

        /*调用第一个对象*/
Sourceable source1 = new SourceSub1();
bridge.setSource(source1);
bridge.method(); /*调用第二个对象*/
Sourceable source2 = new SourceSub2();
bridge.setSource(source2);
bridge.method();
}
}

output:

this is the first sub!

this is the second sub!

这样,就通过对Bridge类的调用,实现了对接口Sourceable的实现类SourceSub1和SourceSub2的调用。

接下来我再画个图,大家就应该明确了,由于这个图是我们JDBC连接的原理,有数据库学习基础的,一结合就都懂了。

7.相关模式

  • Abstract Factory模式能够用来创建和配置一个特定的Bridge模式。
  • Adapter模式用来帮助无关的类协同工作。它通常在系统设计完毕后才会被使用。然而,Bridge模式则是在系统開始时就被使用,它使得抽象接口和实现部分能够独立进行改变。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm

http://item.jd.com/10057319.html

http://blog.csdn.net/zhangerqing/article/details/8239539

Structual设计--Bridge模式的更多相关文章

  1. Structual设计--Flyweight模式

    1.意图 运用共享技术有效地支持大量细粒度的对象. 2.别名 无 3.动机 有些应用程序得意于在其整个设计过程中採用对象技术,但简单化的实现代价极大.如我们在使用word的时候.假设设置正文字体为:t ...

  2. Bridge 模式

    Bridge 模式将抽象和行为划分开来,各自独立,但能动态的结合.在面向对象设计的基本概念中,对象这个概念实际是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,是一种抽象,一般情况下,行为是 ...

  3. 【结构型】Bridge模式

    桥接模式是为了将对象的抽象与实现分离,使得它们可以独立变化.简简单单的一句话,却已经是站在了更高抽象层面上来看待.设计.解决问题.平常我们多是对具体问题进行分析.抽象,然后就开始设计,这对多数情况下基 ...

  4. 【设计模式】Bridge模式(桥接模式)

    最近的一次面试中,被问到桥接模式,以前呢并没有很仔细的研究过这个设计模式,借此机会剖析一下. 先给出自己对这个模式理解后的源码: interface A{ void methodA(); } inte ...

  5. Java设计模式(6)桥模式(Bridge模式)

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

  6. 设计模式初探-桥接(Bridge)模式

    桥接(Bridge)模式,又称Handle/Body模式,属于对象结构型模式.用于将抽象部分与它的实现部分分离,使它们都可以独立地变化.比如常见的电脑窗口界面,不同的操作系统其窗口界面绘制的原理肯定不 ...

  7. 桥(Bridge)模式

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

  8. Android中Adapter和Bridge模式理解和应用

    一 Adapter模式 意图: 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作. 适用性: 使用一个已存在的类,而它的接口 ...

  9. Bridge模式

    Bridge模式 Bridge模式 在面向对象的开发过程中,要做到2点:1.高内聚(cohesion).2.松耦合(coupling).可是在实际开发过程中难以把握,比如会遇到这种问题: 1)客户给了 ...

随机推荐

  1. Spring_对缓存的支持

    使用SpringBoot开启缓存分为两步: 开启基于注解的缓存 标注缓存注解即可 如上就是一个简单的缓存示例 默认使用的是ConcurrentHashMap组件用来缓存的 package ustc.a ...

  2. 在虚拟机linux环境下编译windows版adb fastboot

    原文出自:http://blog.chinaunix.net/uid-20546441-id-1746200.html 我根据虚拟机编译遇到的问题进行一些添加 [前提条件] Linux Android ...

  3. sublime text 3 安装Nodejs插件

    如题 1)集成Nodejs插件到sublime,地址:https://github.com/tanepiper/SublimeText-Nodejs2)解压zip文件, 并重命名文件夹“Nodejs” ...

  4. git命令使用(一)

    作为程序员怎么能不了解git命令呢,但是由于本人不常用到git命令,现在的软件上也都一体化了,能够简化命令,直接运行都可以了,完全能够去实现git上的命令,导致输入git命令完全不会,git命令能够让 ...

  5. 【2018 CCPC网络赛】1001 - 优先队列&贪心

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6438 获得最大的利润,将元素依次入栈,期中只要碰到比队顶元素大的,就吧队顶元素卖出去,答案加上他们期中 ...

  6. Spring AOP 详细介绍

    一.理解 “面向切面编程” 面向切面编程(Aspect Oriented Programming,AOP)是软件编程思想发展到一定阶段的产物,是对面向对象编程(Object Oriented Prog ...

  7. mysql中别名(列别名和表别名)

    1.介绍 使用MySQL别名来提高查询的可读性.MySQL支持两种别名,称为列别名和表别名. 有时,列的名称是一些表达式,使查询的输出很难理解.要给列一个描述性名称,可以使用列别名.用法: SELEC ...

  8. (7) openssl dgst(生成和验证数字签名)

    该伪命令是单向加密工具,用于生成文件的摘要信息                  也可以进行数字签名,及验证数字签名. 首先要明白的是,数字签名的过程是计算出摘要信息,然后使用私钥对摘要信息进行加密得 ...

  9. JavaScript CSS 等前端推荐

    推荐两个网站,JAVASCRIPT与前端相关,两边都可以玩,蛮方便的,然后全通后你拿个全英文版本的证书提升逼格. https://www.freecodecamp.org/ https://www.f ...

  10. 3.3.4 使用 awk 重新编排字段

    awk 本身所提供的功能完备,已经是一个很好用的程序语言了.以后会好好地介绍该语言的精髓.虽然 awk 能做的事很多,但它主要的设计是要在 Shell脚本中发挥所长:做一些简单的文本处理,例如取出字段 ...