桥接模式不是一个使用频率很高的设计模式,但是它非常好的体现了开闭原则和合成/聚合复用原则。所谓合成/聚合复用原则指的是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的。使用合成/聚合复用原则可以使系统更加的灵活,降低系统间各个模块的耦合。桥接模式是用于把抽象化与实现化解耦,使得二者可以独立变化。
举个例子现在我们需要使用不同的编程语言来连接不同的数据库。现在可以使用的编程语言分别为php、java、python;数据库分别为Mysql、Oracle、SQL server。首先定义一个获取数据库连接的接口和几个具体数据库的实现。
public interface DbConnection { public void getConnection(); }
public class MysqlConnection implements DbConnection{ public void getConnection() { System.out.println("获取mysql的数据库连接"); } } public class OracleConnection implements DbConnection{ public void getConnection() { System.out.println("获取oracle的数据库连接"); } }
定义一个语言的抽象类,包含一个数据库连接对象的引用。
public abstract class Language { protected DbConnection connection; protected Language(DbConnection connection) { this.connection = connection; } public abstract void useLanguage(); }
使用具体的语言来继承语言的抽象类:
public class JavaConnection extends Language{ protected JavaConnection(DbConnection connection) { super(connection); } @Override public void useLanguage() { System.out.println("使用java"); connection.getConnection(); } }
客户端调用:
public static void main(String[] args) { Language language = new JavaConnection(new MysqlConnection()); language.useLanguage(); } 执行结果: 使用java 获取mysql的数据库连接
现在我们可以轻松的使用不同的语言来连接不同的数据库。使用桥接模式,将继承关系转化成关联关系,它降低了类与类之间的耦合度,提高了系统的灵活性。