zoukankan      html  css  js  c++  java
  • Structual设计--Bridge模式

    1.意图

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

    2.别名

    Handle/Body

    3.动机

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

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

    4.适用性

    下面情况使用Bridge模式:

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

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

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

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

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

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

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

    5.结构

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

    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连接的原理,有数据库学习基础的,一结合就都懂了。
    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

  • 相关阅读:
    Bootstrap的datetimepicker插件使用
    值得关注几个博客
    Windows下安装和配置tomca(免安装版本)
    AC自动机
    反向输出链表
    替换空格
    二维数组中的查找
    windows下配置nginx+php环境
    HTTP协议详解
    leetcode.3Sum
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7206908.html
Copyright © 2011-2022 走看看