将抽象化与实现化解耦,使二者可以独立地变化。
抽象化角色(Abstraction):定义抽象化的接口。并保存一个对Implementor对象的引用。
修正抽象化角色(Refined Abstraction):改变和修正Abstraction对抽象化的定义。
实现化角色(Implementor):定义实现化的接口。必须指出的是,这个接口不一定与抽象化的接口定义相同,实际上,这两个接口可以完全不同。实现化应当只给出底层操作,而抽象化应当只给出基于底层操作的更高层次的操作。
具体实现化角色(Concrete Implementor):对Implementor接口的具体实现。
public class Abstraction{ protected Implementor impl; public void operation(){ //将客户端操作委派给实现化对象 impl.operationImpl(); } } public class RefinedAbstraction extends Abstraction{ @Override public void operation(){ System.out.println("增强处理"); super.operation(); System.out.println("增强处理"); } } public interface Implementor{ public void operationImpl(); } public class ConcreteImplementorA implements Implementor{ @Override public void operationImpl(){ System.out.println("底层操作"); } } public class ConcreteImplementorB implements Implementor{ @Override public void operationImpl(){ System.out.println("底层操作"); } }
大多数的驱动器(Driver)都是桥梁模式的应用。使用驱动器的应用系统就是抽象化角色,而驱动器本身扮演实现化角色。
JDBC为所有的关系数据库提供了通用的操作接口(JDBC API),JDBC API(应用系统)可以动态地选择一个合适的驱动器,然后通过驱动器向数据库引擎发出指令。这个过程就是将抽象化角色的行为委派给实现化角色的过程。
抽象化角色(JDBC API)可以针对任何数据库引擎发出查询指令,因为抽象化角色不直接与数据库引擎打交道,JDBC驱动器(实现化角色)负责这个底层工作。由于JDBC驱动器的存在,应用系统(JDBC API)可以不依赖于数据库引擎的细节而独立地演化。同时数据库引擎也可以独立于应用系统的细节而独立演化。
应用程序建立在JDBC API这个抽象化角色的基础之上。
如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
设计要求实现化的任何改变不应当影响客户端,或者说实现化的改变对客户端是完全透明的。
一个构件有多于一个的抽象化角色和实现化角色,系统需要他们之间进行动态耦合。