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. 【转】C#的版本

    这年头啥东东都喜欢过段时间整个啥新版本出来.汽车,手机如此,软件就更是如此了啊.比如啥Iphone 4,Iphone 5,Windows 8,Oracle 12C,SQL Server 2010. 版 ...

  2. 【MyBatis】MyBatis Tomcat JNDI原理及源码分析

    一. Tomcat JNDI JNDI(java nameing and drectory interface),是一组在Java应用中访问命名和服务的API,所谓命名服务,即将对象和名称联系起来,使 ...

  3. Mac下Apache服务器的初步搭建

    回送地址  127.0.0.1(localhost)  ping 这个地址可以检测网卡是否正常 ping 本地地址如果不正常说明网线挂了   // 启动 sudo apachectl -k start ...

  4. visual studio中使用vim快捷键

    vsvim下载链接: https://marketplace.visualstudio.com/items?itemName=JaredParMSFT.VsVim 下载,关闭visual studio ...

  5. 哈理工(HUST)第八届程序设计竞赛--小乐乐的组合数

    这道题目是一道数学题,我们可以假设n为7,m为14. 这样的话我们就可以很清晰地看到7和7可以拼接在一起,这是一对,然后是7和14拼接在一起,第二对. 我们可以直接让n/7,m/7,这样就是1*2,就 ...

  6. Jenkins中部署Sonar代码检查

    1 安装并启动sonarqube docker pull sonarqube:7.5-community docker run \ --name sonarqube \ --network ci \ ...

  7. SpringMVC的删除功能

    Dao层 package net.roseindia.dao; import java.util.Date; import java.util.List; import net.roseindia.m ...

  8. HDU 5421 Victor and String

    Victor and String Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on HDU. Orig ...

  9. ES6__字符串、数组、对象的扩展

    /** * 字符串的扩展 */ // 模板字符串 tab上面的反向符号 // 添加${} // let flag = true; // // let html = `<ul> // < ...

  10. 免费第三方API平台整合

    各大平台免费接口,非常适用 http://developer.51cto.com/art/201412/458778.htm 绝对干货:供个人开发者赚钱免费使用的一些好的API接口http://www ...