Structual设计--Bridge模式

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

时间: 2024-10-09 09:09:19

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

Structual设计--Adapter模式

1.意图 将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原来由于接口不兼容而不能在一起工作的那些类可以在一起工作. 2.别名 包装器Wrapper. 3.动机 有时,为复用而设计的工具箱类不能够被复用原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配.具体场景可以描述为:基础功能类–>adapter专业接口–>专业调用,其中基础功能类可以理解为我们常见的jdk,也可以是一些sdk或者一些平台支持类. 4.适用性 以下情况使用Adapter模式 你想使用一个已经存在的类,而

Structual设计--Flyweight模式

1.意图 运用共享技术有效地支持大量细粒度的对象. 2.别名 无 3.动机 有些应用程序得意于在其整个设计过程中采用对象技术,但简单化的实现代价极大.如我们在使用word的时候,如果设置正文字体为:text.setFont(new Font("細明體", Style.BOLD, 12));每一个文字我们都需要这样设置,内存太大,而且也非常难记,稍有不注意就会出错.所以通常并不是对每个字符都用一个单独的对象去表示.Flyweight模式描述了如何共享对象,是的可以细粒度地使用他们而无需高

Structual设计--Proxy 模式

1.意图 为其他对象提供一种代理以控制对这个对象的访问. 2.别名 Surrogate 3.动机 对一个对象进行访问控制的一个愿意是为了只有在我们确实需要这个对象时才对他进行创建和初始化.譬如手机上加载图片,每一个屏幕的大小是有限定的,我们无需每次把所有图片都加载上,只有在需要展示的时候才对图片进行创建和初始化. 4.适用性 在需要用比较通用和复杂的对象指针代理简单的指针的时候,使用Proxy.下面是一些可以使用Proxy模式常见的情况: 远程代理(Remote Proxy)为一个对象在不同的地

Structual设计--Composite模式

1.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.别名 无 3.动机 在绘图编辑器和图形捕捉系统这样的图形应用程序中,用户可以使用简单的组件创建复杂的图表.用户可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成更大的组件.一个简单的实现方法是为Text和Line这样的图元定义一些类,另外定义一些类作为这些图元的容器类(Container). 然而存在一个问题:使用这些类的代码必需区别对待图元对

Structual设计--Facade模式

1.意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用. 2.别名 无 3.动机 将一个系统划成为若干个子系统有利于降低系统的复杂性.一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小.达到该目标的途径之一是引入一个外观(facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面.例如算法库有很多算法类,我们在使用的时候分别去调用,最后算法库的外部调用和算法之间的关系会变的错综复杂,这就需要我们引入facad

Structual设计--Decorator 模式

1.意图 动态的给一个对象添加额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器Wrapper. 3.动机 有时,我们希望给某个对象而不是整个类添加一些功能.例如,肯德基推出特价套餐,如果套餐1中有:汉堡和鸡腿和价格,套餐二中有:薯条和汉堡和价格,如果做继承类,而且是多继承明显不够灵活,那么就需要装饰类. 4.适用性 以下情况使用Decorator模式 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. 处理他那些可以撤销的职责. 当不能采用

敏捷软件开发 – ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式

设计运行在简易台灯中的软件.台灯由一个开关和一盏灯组成.可以询问开关是开着还是关着,也可以让灯打开或者关闭. 下面设计了一个简易的模型.Switch对象可以轮询实际开关的状态,并且可以发送相应的turnOn和turnOff消息给Light. 这个设计违反了两个设计原则:依赖倒置(DIP)和开放-封闭(OCP).对DIP的违反是明显的,Switch依赖了具体类Light.DIP告诉我们要优先依赖于抽象类.对OCP的违反虽然没有那么明显,但是更加切中要害.我们之所以不喜欢这个设计是因为它迫使我们在任

桥(Bridge)模式

Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以下两种: 这多个具体实现之间恰好是并列的,如前面举例,打桩,有两个concrete class:方形桩和圆形桩:这两个形状上的桩是并列的,没有概念上的重复,那么我们只要使用继承就可以了.实际应用上,常常有可能在这多个concrete class之间有概念上重叠.那么需要我们把抽象共同部分和行为共同部

Java桥模式(Bridge模式)

Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以下两种: 这多个具体实现之间恰好是并列的,如前面举例,打桩,有两个concrete class:方形桩和圆形桩:这两个形状上的桩是并列的,没有概念上的重复,那么我们只要使用继承就可以了. 实际应用上,常常有可能在这多个concrete class之间有概念上重叠.那么需要我们把抽象共同部分和行为共同